SDWebImage 15.9.1中废弃API removeImage的使用疑问
解决SDWebImage 15.9.1中
removeImage(forKey:cacheType:completion)废弃问题 提示信息的含义
提示里的“Cast to cache instance and call its API”意思是:不要再用顶层的废弃API,而是直接获取对应的缓存实例(内存缓存/磁盘缓存),调用实例本身的删除方法。SDWebImage 15+重构了缓存层的API,把原来顶层统一的删除接口拆分到了具体的缓存实例上。
具体操作步骤
SDWebImage的缓存分为内存缓存(SDMemoryCache,基于NSCache实现)和磁盘缓存(SDDiskCache)两类,你需要根据原代码指定的cacheType,分别操作对应的缓存实例:
1. 按缓存类型单独删除
- 若原代码指定
.memory(仅删除内存缓存):let memoryCache = SDImageCache.shared.memoryCache memoryCache.removeObject(forKey: "你的缓存Key") { // 删除完成后的回调逻辑 } - 若原代码指定
.disk(仅删除磁盘缓存):let diskCache = SDImageCache.shared.diskCache diskCache.removeObject(forKey: "你的缓存Key") { error in // 可在这里处理删除失败的错误 completion?() } - 若原代码指定
.all(同时删除内存和磁盘缓存):let memoryCache = SDImageCache.shared.memoryCache let diskCache = SDImageCache.shared.diskCache // 先删内存缓存,完成后再删磁盘缓存 memoryCache.removeObject(forKey: "你的缓存Key") { diskCache.removeObject(forKey: "你的缓存Key") { _ in // 全部删除完成后的回调 } }
2. 封装兼容旧调用方式(可选)
如果想保留原方法的调用形式,避免大面积修改代码,可以自己封装一个扩展方法:
extension SDImageCache { func removeImage(forKey key: String, cacheType: SDImageCacheType, completion: (() -> Void)?) { switch cacheType { case .memory: memoryCache.removeObject(forKey: key) { completion?() } case .disk: diskCache.removeObject(forKey: key) { _ in completion?() } case .all: memoryCache.removeObject(forKey: key) { [weak self] in self?.diskCache.removeObject(forKey: key) { _ in completion?() } } @unknown default: completion?() } } }
这样就能继续用原来的调用逻辑,内部自动适配新API。
注意事项
- 磁盘缓存的删除方法会返回可选错误,可根据业务需求处理删除失败的场景
- 不需要直接操作底层的
NSCache,SDWebImage已经将其封装在SDMemoryCache中,直接调用实例方法即可
内容的提问来源于stack exchange,提问作者Coder
相关产品推荐
相关产品推荐

