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



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

在HTTP服务器上,这称为请求组合,我想在客户端做同样的事情-将相同URL的不同请求组合成单个请求,然后分别回调给每个调用者)。对该URL的请求不会同时开始。

实现这一点的最好方法是什么?

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

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

有更简单的选择吗?

我遇到了一个类似的问题,并认为您的方法是最直接的。增加了一点复杂性的是,这些下载需要特殊的凭据,因此必须经过它们自己的操作队列。下面是我的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何时在飞行中,并能够根据该知识采取行动。

相关内容

最新更新