gpt4 book ai didi

ios - 如何使用 AFNetworking 跟踪多个同时下载的进度?

转载 作者:技术小花猫 更新时间:2023-10-29 10:26:20 26 4
gpt4 key购买 nike

我正在使用 AFNetworking 下载我的应用程序用于同步解决方案的文件。在某些时候,该应用程序会以批处理为单位下载一系列文件。 Following this example ,我像这样运行批处理:

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。但是,当您同时进行多个下载时,很难全面跟踪。

我考虑过为每个 HTTP 操作创建一个带有 key 的 NSMutableDictionary,一般格式如下:

NSMutableArray *downloadProgress = [NSMutableArray arrayWithArray:@{
@"DownloadID1" : @{ @"totalBytesRead" : @0, @"totalBytesExpected" : @100000},
@"DownloadID2" : @{ @"totalBytesRead" : @0, @"totalBytesExpected" : @200000}
}];

随着每个操作下载的进行,我可以在中央 NSMutableDictionary 中为该特定操作更新 totalBytesRead —— 然后将所有 totalBytesRead 加起来code> 和 totalBytesExpected' 得出整个批处理操作的总数。但是AFNetworking的进度回调方法downloadProgressBlock,定义为^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead){}不包含具体操作作为回调 block 变量(与 successfailure` 回调相反,后者确实包含特定操作作为变量,使其可访问)。据我所知,这使得无法确定具体是哪个操作在进行回调。

关于如何使用 AFNetworking 跟踪多极同时下载的进度有什么建议吗?

最佳答案

如果您的 block 是内联的,您可以直接访问操作,但编译器可能会警告您循环引用。您可以通过声明弱引用并在 block 内使用它来解决:

__weak AFHTTPRequestOperation weakOp = operation;
[operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
NSURL* url = weakOp.request.URL; // sender operation's URL
}];

实际上,您可以访问 block 内的任何内容,但您需要了解 block 才能做到这一点。通常, block 中引用的任何变量都在 block 创建时复制,即该行被执行的时间。这意味着当 setDownloadProgressBlock 行被执行时,我在 block 中的 weakOp 将引用 weakOp 变量的值。你可以这样想,如果你的 block 立即执行,你在 block 中引用的每个变量会是什么。

关于ios - 如何使用 AFNetworking 跟踪多个同时下载的进度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20380011/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com