Я хочу загрузить несколько файлов, а затем показать пользователю общий прогресс.
но проблема в том, что я не знаю, как рассчитать общий прогресс.
вот что я делаю: сначала я добираюсь до 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
Вот как я этого добился: сначала создайте NSOperationQueue:
operationQueue работает как список FIFO, сначала рассчитывается размер байта изображения, затем начинается загрузка всех изображений
пожалуйста, объясните, как использовать завершенияBlock и progressCallback. Также, где вы начинаете операцию, например [downloadFileOperation Start]. Пожалуйста, прокомментируйте. Я немного застрял здесь. — person Hashem Aboonajmi; 29.01.2015
нет необходимости запускать операцию явно, операция загрузки будет запущена неявно путем добавления операции в Очередь операций. Также завершениеBlock и progressCallback — мои настраиваемые блоки, которые будут уведомлять меня о ходе загрузки, сбое или успехе загрузки. — person Hashem Aboonajmi; 29.01.2015
AFNetworking3 использует
dispatch_group
иNSProgress
для достижения этого: