我有一个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何时在飞行中,并能够根据该知识采取行动。