我有一个UI,其中几个UIImageViews可以在不同的时间请求相同的图像URL。显然,如果其中一个请求已完成,则返回缓存版本将按预期工作。但是,特别是对于较慢的网络,我希望能够将对图像URL的请求捎带到同一URL的任何当前正在运行/等待的HTTP请求上。
在HTTP服务器上,这个被称为请求组合并且我喜欢在客户端中执行相同操作 - 将对同一URL的不同请求组合到单个请求中,然后分别回调给每个呼叫者)。对该URL的请求不会同时开始。
实现这一目标的最佳方式是什么?
我认为重写UIImageView + AFNetworking可能是最简单的方法:
任何更简单的替代品?
答案 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何时正在运行,并能够采用该知识采取行动。