Ios 使用SDWebImage忽略查询参数
我正在使用Ios 使用SDWebImage忽略查询参数,ios,caching,amazon-s3,sdwebimage,Ios,Caching,Amazon S3,Sdwebimage,我正在使用SDWebImage在我的应用程序中缓存图像,但是最近我遇到了一个问题,即应该缓存的图像会不断刷新。通过查看,我发现AWS的完整图像url实际上正在发生变化,这是由于url末尾附加了一些参数。每次我获取包含图像url的对象时,图像url都会返回一个动态“签名”和“过期”参数(出于安全目的)。就图像缓存而言,使用不同的url,但请注意图像的路径相同 首次提取: https://myapp.s3.amazonaws.com/path/image123.jpeg?AWSAccessKeyId
SDWebImage
在我的应用程序中缓存图像,但是最近我遇到了一个问题,即应该缓存的图像会不断刷新。通过查看,我发现AWS的完整图像url实际上正在发生变化,这是由于url末尾附加了一些参数。每次我获取包含图像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
有一个选项可以忽略文件路径以外的查询参数,那就太棒了。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;
}
更多阅读:@John的答案很好,但我有时会遇到崩溃 下面是比较稳定的版本
SDWebImageManager.sharedManager.cacheKeyFilter=^(NSURL*url){
如果([[url absoluteString]IsequalString:@”“])){
返回@”;
}
url=[[NSURL alloc]initWithScheme:url.scheme主机:url.host路径:url.path];
返回[url绝对字符串];
};
此附加代码检查url是否有效<代码>[[NSURL alloc]initWithString:@']或类似的东西会导致崩溃。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
}
[NSURL initWithScheme:host:path:][/code>在iOS10中不推荐使用。
应改用nsurl组件
我的更新解决方案:
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];
};
iOS 14 | | Swift 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
缓存逻辑生成公共缓存键标识符,以便再次正常工作
比如:
将具有缓存密钥:
注意:注意最后的url。如果url依赖于其动态输出的查询参数,则显然您需要修改SDWebImageCacheKeyFilter
中的逻辑以满足您的要求。请解释您的答案,即使它将解释与另一个答案类似的内容,你的答案也可以解释你发布的代码。@SuperBiasedMan[[NSURL alloc]initWithString:@”“]
或类似的东西崩溃了@John的代码。捕捉得好@satoshisuki。