0

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

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

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

我尝试开始下载请求

[afhttpClient enqueueBatchOfHTTPRequestOperations:operationArray 
                                              progressBlock:progressBlock 
                                            completionBlock:completionBlock];

似乎不起作用,那么上面的代码和在循环中使用[操作开始]开始下载请求有什么区别?

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

4

3 回答 3

2

您很可能有一个用于下载图像的 URL 对象的 NSArray。您需要做的是创建一个等于 URL 对象计数的整数值。每次您成功下载图像或绝对无法下载图像时(例如在几次超时或收到 404 HTTP 状态代码后),您都需要减少该整数(请注意,它应该是原子属性,因为块在不同的线程)。一旦计数达到零 - 所有请求都已完成。您还可以使用该整数来更新进度条或简单地通知用户“已下载 #/15 图像”。如果您需要任何其他说明,请告诉我。

不幸的是我没有使用过 AFHTTPClient,所以我不能准确地告诉你这两个操作之间的区别,但是从上下文来看,第一个几乎同时异步执行所有请求,而后一个使用连续方法,其中第二个请求只会在第一个完成后启动。

于 2012-04-09T11:58:26.713 回答
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 版本配合得很好。

希望对您有所帮助……</p>

于 2012-12-20T16:20:59.483 回答
0

您可以创建 NSOperationQueue 并将所有 AFHTTPRequestOperation 放入其中。使用 KVO 观察“操作”。当计数变为零时,即表示所有操作都已完成。

于 2012-08-07T08:12:53.150 回答