我正在使用SDWebImage
在我的应用中缓存图片,但是我最近遇到了一个问题, 缓存的图片会保持刷新状态。调查一下,我发现来自AWS的完整图像网址实际上是由于参数添加到网址末尾而改变的。每次我获取包含图像URL的对象时,图像url返回动态“签名”和“过期”参数(出于安全目的)。就图像缓存而言,它是一个不同的URL,但请注意图像的相同路径。
首先获取:
https://myapp.s3.amazonaws.com/path/image123.jpeg?AWSAccessKeyId=SOMEKEY&Signature=vrUFlMFEQ9fqQ%3D&Expires=1441702633
1秒后再次获取:
https://myapp.s3.amazonaws.com/path/image123.jpeg?AWSAccessKeyId=SOMEKEY&Signature=2mcMxUJLyJd7E%3D&Expires=1441703105
处理这种情况的最佳方法是什么?如果SDWebImage
可以选择忽略文件路径之外的查询参数,那肯定会很棒。
答案 0 :(得分:11)
SDWebImage有一个允许使用自定义密钥的方法,这有助于在这种情况下AWS每次调用时都会更改查询。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
SDWebImageManager.sharedManager.cacheKeyFilter = ^(NSURL *url) {
url = [[NSURL alloc] initWithScheme:url.scheme host:url.host path:url.path];
return [url absoluteString];
};
// Your app init code...
return YES;
}
答案 1 :(得分:6)
下面是更稳定的版本。
SDWebImageManager.sharedManager.cacheKeyFilter = ^(NSURL *url) {
if( [[url absoluteString] isEqualToString:@""] ){
return @"";
}
url = [[NSURL alloc] initWithScheme:url.scheme host:url.host path:url.path];
return [url absoluteString];
};
此附加代码检查url是否有效。 [[NSURL alloc] initWithString:@""]
或类似的东西会导致崩溃。
答案 2 :(得分:6)
Swift语言的答案:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
...............
SDWebImageManager.sharedManager().cacheKeyFilter = { url in
if url.absoluteString == "" {
return ""
}
let newUrl = NSURL(scheme: url.scheme, host: url.host, path: url.path!)!
return newUrl.absoluteString
}
return true
}
答案 3 :(得分:0)
[NSURL initWithScheme: host: path:]
。
应该使用NSURLComponents
代替。
我更新的解决方案:
SDWebImageManager.sharedManager.cacheKeyFilter = ^NSString *(NSURL *url) {
if([[url absoluteString] isEqualToString:@""]){
return @"";
}
NSURLComponents *urlComponents = [[NSURLComponents alloc] initWithURL:url resolvingAgainstBaseURL:NO];
urlComponents.query = nil;
return [[urlComponents URL] absoluteString];
};
答案 4 :(得分:0)
iOS 14 ||斯威夫特 5
SDWebImageManager.shared.cacheKeyFilter = SDWebImageCacheKeyFilter { url in
var components = URLComponents(url: url, resolvingAgainstBaseURL: false)
components?.query = nil
print("SDWebImage Cache Key:", components?.url)
return components?.url?.absoluteString ?? ""
}
因此,在启动时配置 SDWebImageManager
,然后每当提供 url
时,它将被剥离其所有查询参数以生成公共缓存键标识符以供 SDWebImage
缓存逻辑工作再次正确。
比如:
<块引用>将有缓存键:
<块引用>https://bucket.s3.us-east-1.amazonaws.com/public/someAsset.ext
注意:请注意最终网址。如果 url 依赖于其动态输出的查询参数,那么显然您需要修改 SDWebImageCacheKeyFilter
中的逻辑以满足您的要求。