gpt4 book ai didi

ios - AF网络。检查所有操作队列的下载进度

转载 作者:可可西里 更新时间:2023-11-01 05:36:54 25 4
gpt4 key购买 nike

我有一个使用 AFNetworking 制作的 iOS 应用程序。我有一个单独的自定义 httpclient 子类,我用它来使用我的 api 并从服务器下载二进制文件。

我需要下载大约 100 个文件。遍历我的 url 数组并为每个 url 创建一个 AFHTTPRequestionOperation 是否安全?我的代码是这样的:

NSMutableURLRequest* rq = [[MIHTTPClient sharedInstance] requestWithMethod:@"GET" path:@"...." parameters:nil];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:rq] ;
operation.outputStream = [NSOutputStream outputStreamToFileAtPath:path append:NO];

[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
//completion

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
//manage error
}];


[[MIHTTPClient sharedInstance] enqueueHTTPRequestOperation:operation];

我如何才能收到来自该队列的反馈?我没有看到任何“HTTPClientDelegate”协议(protocol)或类似的东西。

最佳答案

有关进展,请参阅 setDownloadProgressBlock (AFURLConnectionOperation 的一部分,AFHTTPRequestOperation 是其子类),例如:

[operation setDownloadProgressBlock:^(NSInteger bytesWritten, NSInteger totalBytesWritten, NSInteger totalBytesExpectedToWrite) {
NSLog(@"Sent %d of %d bytes, %@", totalBytesWritten, totalBytesExpectedToWrite, path);
}];

并且,在您的代码示例中,您正在调用 setCompletionBlockWithSuccess:failure:,以便提供有关各个操作完成的状态。就我个人而言,在我的小测试中,我只是维护我请求的下载数组,并让这三个 block (进度、成功和失败)更新我的下载状态代码,如下所示:

for (NSInteger i = 0; i < 20; i++)
{
NSURLRequest *request = ... // set the request accordingly

// create a download object to keep track of the status of my download

DownloadObject *object = [[DownloadObject alloc] init];
download.title = [NSString stringWithFormat:@"Download %d", i];
download.status = kDownloadObjectStatusNotStarted;
[self.downloadObjects addObject:download];

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];

[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
download.status = kDownloadObjectStatusDoneSucceeded;

// update my UI, for example, I have table view with one row per download
//
// [self.tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:i inSection:0]]
// withRowAnimation:UITableViewRowAnimationNone];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
download.status = kDownloadObjectStatusDoneFailed;

// update UI
//
// [self.tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:i inSection:0]]
// withRowAnimation:UITableViewRowAnimationNone];
}];

[operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
download.totalBytesRead = totalBytesRead;
download.status = kDownloadObjectStatusInProgress;

// update UI
//
// [self.tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:i inSection:0]]
// withRowAnimation:UITableViewRowAnimationNone];
}];

[queue addOperation:operation];
}

您可以通过这种方式跟踪单个下载。您也可以只跟踪挂起的操作(或查询 HTTPClient 对象的 operationQueue 属性,并查看它的 operationCount 属性)。


就下载100个文件而言,两点考虑:

  • 我本以为您会想在 HTTPClient 子类的 operationQueue 上调用 setMaxConcurrentOperationCount,将其设置为一些合理的数字(4 或 5),看一眼 AFNetworking 代码,它似乎并没有这样做。我发现,如果超出这个范围, yield 就会递减,并且如果所有文件都来自单个服务器,那么在给定客户端和给定服务器之间可以完成多少并发操作就会受到限制。

  • 我读过一些传闻,称 Apple 将拒绝通过蜂窝网络发出异常请求的应用程序。参见 https://stackoverflow.com/a/14922807/1271826 .

关于ios - AF网络。检查所有操作队列的下载进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15161758/

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