Я использую AFNetworking для загрузки файлов, которые мое приложение использует для решения синхронизации. В определенное время приложение загружает серию файлов в виде пакетного устройства. Следуя этому примеру, я запускаю пакет следующим образом:
NSURL *baseURL = <NSURL with the base of my server>;
AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:baseURL];
// as per: /info/110573/how-to-batch-request-with-afnetworking-2/689421#689421
dispatch_group_t group = dispatch_group_create();
for (NSDictionary *changeSet in changeSets) {
dispatch_group_enter(group);
AFHTTPRequestOperation *operation =
[manager
POST:@"download"
parameters: <my download parameters>
success:^(AFHTTPRequestOperation *operation, id responseObject) {
// handle download success...
// ...
dispatch_group_leave(group);
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
// handle failure...
// ...
dispatch_group_leave(group);
}];
[operation start];
}
// Here we wait for all the requests to finish
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
// run code when all files are downloaded
});
Это хорошо работает для пакетных загрузок. Тем не менее, я хочу показать пользователю MBProgressHUD, который показывает им, как идут загрузки.
AFNetworking предоставляет метод обратного вызова
[operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
}];
..., что позволяет легко обновить индикатор выполнения, просто установив ход на totalBytesRead / totalBytesExpectedToRead
. Но когда вы одновременно загружаете несколько загрузок, которые сложно отслеживать на основе общей информации.
Я рассмотрел наличие NSMutableDictionary
с ключом для каждой операции HTTP с этим общим форматом:
NSMutableArray *downloadProgress = [NSMutableArray arrayWithArray:@{
@"DownloadID1" : @{ @"totalBytesRead" : @0, @"totalBytesExpected" : @100000},
@"DownloadID2" : @{ @"totalBytesRead" : @0, @"totalBytesExpected" : @200000}
}];
Как только каждая загрузка загрузки прогрессирует, я могу обновить totalBytesRead
для этой конкретной операции в центральном NSMutableDictionary
, а затем суммировать все totalBytesRead
и totalBytesExpected' to come up with the total for the whole batched operation. However, AFNetworking progress callback method
downloadProgressBlock , defined as
^ (NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {} does not include the specific operation as a callback block variable (as opposed to the
успешные обратные вызовы and
fail, которые содержат определенную операцию как переменную, что делает ее доступной). Это делает невозможным, насколько я могу судить, определить, какая операция специально выполняет обратный вызов.
Любые предложения о том, как отслеживать ход одновременной загрузки мультиполя с помощью AFNetworking?