AFNetworking监控所有下载过程

时间:2012-04-09 11:20:06

标签: iphone objective-c ios afnetworking

我正在尝试从远程下载文件,现在我可以监控每个文件的下载成功状态

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

但是有什么方法可以监控整个下载过程?我怎么知道所有下载都已完成?

我尝试用

开始下载请求
[afhttpClient enqueueBatchOfHTTPRequestOperations:operationArray 
                                              progressBlock:progressBlock 
                                            completionBlock:completionBlock];

似乎不起作用,那么上面的代码与循环中的[operation start]开始下载请求之间的区别是什么?

@mattt(如果你能看到这个)

3 个答案:

答案 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版本中运行良好。

希望有帮助...