Я использую AFNetworking для загрузки файлов, которые мое приложение использует для решения синхронизации. В определенное время приложение загружает серию файлов в виде пакетной единицы. Следуя этому примеру, я запускаю пакет следующим образом:
NSURL *baseURL = <NSURL with the base of my server>;
AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:baseURL];
// as per: https://stackoverflow.com/a/19883392/353137
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's 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
successand
failure`, которые содержат конкретную операцию как переменную, что делает ее доступной). Что делает невозможным, насколько я могу судить, определить, какая конкретно операция выполняет обратный вызов.
Любые предложения о том, как отслеживать ход многополюсных одновременных загрузок с помощью AFNetworking?
Download
объекту он относится? Учитывая, что когда вы просматриваете список подключений для загрузки, он продолжает воссоздавать объектDownload
. - person Jason   schedule 06.12.2013