如何扩展AFNetworking 2.0以执行请求组合

时间:2014-06-25 22:14:39

标签: afnetworking-2

我有一个UI,其中几个UIImageViews可以在不同的时间请求相同的图像URL。显然,如果其中一个请求已完成,则返回缓存版本将按预期工作。但是,特别是对于较慢的网络,我希望能够将对图像URL的请求捎带到同一URL的任何当前正在运行/等待的HTTP请求上。

在HTTP服务器上,这个被称为请求组合并且我喜欢在客户端中执行相同操作 - 将对同一URL的不同请求组合到单个请求中,然后分别回调给每个呼叫者)。对该URL的请求不会同时开始。

实现这一目标的最佳方式是什么?

我认为重写UIImageView + AFNetworking可能是最简单的方法:

  • 检查af_sharedImageRequestOperationQueue以查看它是否具有相同请求的操作
  • 如果我已经在队列中运行或运行,那么将自己添加到一些回调/块列表中,以便在成功/失败时调用
  • 如果我没有进行操作,则按正常方式创建
  • 在setCompletionBlockWithSuccess中依次调用每个块。

任何更简单的替代品?

1 个答案:

答案 0 :(得分:0)

我遇到了类似的问题,并认为你的方式是最直接的。另外一点复杂性是这些下载需要特殊凭据,因此必须通过他们自己的操作队列。以下是我的UIImageView类别中的代码,用于检查特定URL是否为空中:

NSUInteger foundOperation = [[ConnectionManager sharedConnectionManager].operationQueue.operations indexOfObjectPassingTest:^BOOL(AFHTTPRequestOperation *obj, NSUInteger idx, BOOL *stop) {
    BOOL URLAlreadyInFlight = [obj.request.URL.absoluteString isEqualToString:URL.absoluteString];
    if (URLAlreadyInFlight) {
        NSBlockOperation *updateUIOperation = [NSBlockOperation blockOperationWithBlock:^{
            [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                self.image = [[ImageCache sharedImageCache] cachedImageForURL:URL];
            }];
        }];
        //Makes updating the UI dependent on the completion of the matching operation.
        [updateUIOperation addDependency:obj];
    }

    return URLAlreadyInFlight;
}];

你能提出更好的解决方案吗?

编辑:好吧,看起来我更新UI的方法无法正常工作,因为操作的完成块是异步运行的,因此操作在块运行之前完成。但是,我能够修改图像缓存,以便能够在缓存某些URL时添加回调,这似乎可以正常工作。因此,此方法可以正确检测某些URL何时正在运行,并能够采用该知识采取行动。