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。