Один индикатор выполнения для загрузки нескольких файлов

63
5

Я пытаюсь загрузить 2 изображения (по одному) с помощью NSURLSessionTask.

- (void)URLSession:(NSURLSession *)session
task:(NSURLSessionTask *)task
didSendBodyData:(int64_t)bytesSent
totalBytesSent:(int64_t)totalBytesSent
totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend
{
if (self.imageName1 != nil && self.imageName2 != nil)
{
float progress = (float)totalBytesSent / (float)totalBytesExpectedToSend;
if (progress != 1.00)
{
// Calculate total bytes to be uploaded or the split the progress bar in 2 halves
}
}
else if (self.imageName1 != nil && self.imageName2 == nil)
{
float progress = (float)totalBytesSent / (float)totalBytesExpectedToSend;
if (progress != 1.00)
[self.progressBar1 setProgress:progress animated:YES];
}
else if (self.imageName2 != nil && self.imageName1 == nil)
{
float progress = (float)totalBytesSent / (float)totalBytesExpectedToSend;
if (progress != 1.00)
[self.progressBar2 setProgress:progress animated:YES];
}
}

Как я могу использовать один индикатор выполнения, чтобы показать прогресс в случае загрузки 2 изображений?

спросил(а) 2021-01-25T17:06:20+03:00 5 месяцев назад
1
Решение
63

Лучший способ - использовать NSProgress который позволяет вам свертывать дочерние обновления NSProgress в одном.

Поэтому определите родительский NSProgress:

@property (nonatomic, strong) NSProgress *parentProgress;

Создайте NSProgress и сообщите NSProgressView чтобы наблюдать за ним:

self.parentProgress = [NSProgress progressWithTotalUnitCount:2];
self.parentProgressView.observedProgress = self.parentProgress;

Используя observedProgress в NSProgressView, когда NSProgress обновляется, соответствующая NSProgressView будет автоматически обновляться, тоже.

Затем для отдельных запросов создайте отдельные дочерние записи NSProgress которые будут обновляться, например:

self.child1Progress = [NSProgress progressWithTotalUnitCount:totalBytes1 parent:self.parentProgress pendingUnitCount:1];

а также

self.child2Progress = [NSProgress progressWithTotalUnitCount:totalBytes2 parent:self.parentProgress pendingUnitCount:1];

Затем, по мере продолжения отдельных запросов сети, обновите их соответствующий NSProgress с общими байтами:

self.child1Progress.completedUnitCount = countBytesThusFar1;

Обновление completedUnitCount элемента NSProgress отдельных дочерних объектов NSProgress будет автоматически обновлять значение fractionCompleted из родительского объекта NSProgress, который, поскольку вы это NSProgress, соответствующим образом обновит ваше представление прогресса.

Просто убедитесь, что totalUnitCount для родителя будет равно сумме pendingUnitCount для детей.

ответил(а) 2021-01-25T17:06:20+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема