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

Я пытаюсь загрузить 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 изображений?

1 ответ

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

  1. Так определите родителя NSProgress:

    @property (nonatomic, strong) NSProgress *parentProgress;
    
  2. Создать NSProgress и скажи NSProgressView наблюдать это:

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

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

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

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

    а также

    self.child2Progress = [NSProgress progressWithTotalUnitCount:totalBytes2 parent:self.parentProgress pendingUnitCount:1];
    
  4. Затем, по мере выполнения отдельных сетевых запросов, обновите их NSProgress с общим количеством байтов до сих пор:

    self.child1Progress.completedUnitCount = countBytesThusFar1;
    

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

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

Другие вопросы по тегам