我正在尝试从远程下载文件,现在我可以监控每个文件的下载成功状态
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
但是有什么方法可以监控整个下载过程?我怎么知道所有下载都已完成?
我尝试用
开始下载请求[afhttpClient enqueueBatchOfHTTPRequestOperations:operationArray
progressBlock:progressBlock
completionBlock:completionBlock];
似乎不起作用,那么上面的代码与循环中的[operation start]开始下载请求之间的区别是什么?
@mattt(如果你能看到这个)
答案 0 :(得分:2)
您很可能拥有用于下载图像的NSArray URL对象。您需要做的是创建一个等于URL对象计数的整数值。每次成功下载图像或绝对无法下载它(例如在几次超时或收到404 HTTP状态代码后),您需要递减该整数(注意它应该是一个原子属性,因为块正在不同的时候执行线程)。一旦计数达到零 - 所有请求都完成。您还可以使用该整数来更新进度条,或者只是通知用户“下载了#/ 15图像”。如果您需要任何其他说明,请与我们联系。
不幸的是我没有使用AFHTTPClient,所以我不能准确地告诉你两个操作之间的区别,但是在上下文中,第一个几乎同时执行所有请求,而后者使用连续方法,第二个请求只有在完成第一个请求后才会启动。
答案 1 :(得分:0)
您可以创建NSOperationQueue并将所有AFHTTPRequestOperation放入其中。 观察"操作"通过使用KVO。当计数变为零时,就是说完所有操作的时间。
答案 2 :(得分:0)
如果你想要的是每个下载字节和总预期的操作的持续进度更新,那么我强烈推荐Peter Steinberger的AFDownloadRequestOperation。
此类派生自AFHTTPRequestOperation并在操作队列级别添加progressiveDownloadProgressBlock
每个操作而不仅仅是每个操作完成进度,这是我认为您正在寻找的。另一个很大的好处是它使可恢复/部分下载比核心AFNetworking实现更容易访问。
这很容易使用(例如来自GitHub项目的README.md):
[pdfRequest setProgressiveDownloadProgressBlock:^(NSInteger bytesRead,
long long totalBytesRead, long long totalBytesExpected,
long long totalBytesReadForFile, long long totalBytesExpectedToReadForFile)
{
self.downloadProgress = totalBytesReadForFile/(float)totalBytesExpectedToReadForFile;
}];
我在一些企业iOS项目中使用它来下载多GB的文件,我可以告诉你它在AFNetworking的1.0.1版本中运行良好。
希望有帮助...