Я хочу загрузить несколько файлов, а затем показать пользователю общий прогресс.
но проблема в том, что я не знаю, как рассчитать общий прогресс.
вот что я делаю: сначала я добираюсь до totalBytes, ожидаемых от всех файлов:
for (NSURL candidateUrl in UrlsList) { NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:candidateURL]; //setting HTTPMethod of request from GET to HEAD to download header files of requests, so we can get file size before downloaing file [request setHTTPMethod:@»HEAD»]; getTotalImagesBytesOperation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; [getTotalImagesBytesOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { //setting totalImagesBytesExpectedToRead of all images. we use it to know how many bytes we should download for all the images totalImagesBytesExpectedToRead += [operation.response expectedContentLength]; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@»Error: %@», error); }]; [operationQueue addOperation:getTotalImagesBytesOperation]; }
после оценки общего размера файлов:
//downloading images for (NSURL *imageUrl in imagesURLList) { NSURLRequest *request = [NSURLRequest requestWithURL:imageUrl]; AFImageRequestOperation *downloadImageOperation = [AFImageRequestOperation imageRequestOperationWithRequest:request imageProcessingBlock:nil success: ^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) { NSLog(@»success») } failure: ^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) { NSLog(@»%@», [error localizedDescription]); }]; [operationQueue addOperation:downloadImageOperation]; [downloadImageOperation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) { **HOW TO CALCULATE TOTAL PROGRESS** }
Я не знаю, как рассчитать общий размер !! значения, которые у нас есть: totalBytesOfAllTheFiles, totalBytesRead и totalBytesExpectedToRead для текущего файла, который дает вам вышеуказанный метод, indexOfCurrentFile и countOfFiles.
будьте осторожны, setDownloadProgressBlock вызывается сотнями раз.
у кого-нибудь есть идеи? (извините за плохое форматирование кода!)
Не могли бы вы просто разделить totalBytesRead на totalBytesExpectedToRead? — person Hashem Aboonajmi schedule 07.09.2014
@ evan.stoddard totalBytesRead/totalBytesExpectedToRead дает мне процент завершения текущего файла. не все файлы! — person Hashem Aboonajmi schedule 07.09.2014
Первое соображение: вам действительно нужно быть настолько точным, чтобы использовать общее количество байтов для расчета прогресса? Я использовал общее количество загруженных файлов / общее количество файлов, которые нужно загрузить, чтобы рассчитать прогресс приложения. Это намного проще. — person Hashem Aboonajmi schedule 07.09.2014
Подумайте о том, когда ваши первые пять файлов имеют общий размер 1 МБ, а последние пять файлов — 100 МБ. этот расчет не годится. — person Hashem Aboonajmi schedule 07.09.2014
В этом случае единственным способом может быть считывание информации об общем размере из файла данных где-нибудь в сети до начала загрузки. Если это невозможно, вам придется переосмыслить дизайн своего приложения. Вы не можете узнать размер всех файлов до их загрузки. — person Hashem Aboonajmi schedule 08.09.2014
Источник: