SDWebImage清除缓存

36

我正在使用表视图显示从Web下载的带有文本的图标列表。这些图标可以在服务器端更改,因此在新图标可用时,我需要立即替换它们。我尝试使用以下代码:

[imgView setImageWithURL:url placeholderImage:[UIImage imageNamed:@"table_avatar_icon"] options:SDWebImageCacheMemoryOnly];

我在我的刷新回调函数中调用[[SDImageCache sharedImageCache] clearMemory];,但它并不清除缓存的内容。更重要的是,即使我关闭应用程序并重新打开,图像仍然存在。

我只找到一种清除缓存的方法,那就是调用[[SDImageCache sharedImageCache] clearDisk];。但这只能在我关闭并重新打开应用程序后才有效。

如何强制SDWebImage不使用磁盘缓存?


对于那些只想每次重新下载一些图像的人,可以将SDWebImageRefreshCached传递到选项中。 - Eugene
5个回答

114
SDImageCache *imageCache = [SDImageCache sharedImageCache];
[imageCache clearMemory];
[imageCache clearDisk];

别忘了在你的didReceiveMemoryWarning方法中也加入这些代码行。


21
SDWebImage的当前版本会在内存警告发生时自动清除内存缓存,不需要手动操作,特别是不需要清除磁盘缓存。 - Tomas Andrle
请问您能否添加一个来源?哪个版本会完全支持这些功能呢? - Carmen
1
最好使用非阻塞版本 - clearDiskOnCompletion。 - Rizon
1
@Rizon,clearDisk 不是阻塞的!唯一的区别是它没有完成回调函数。 - Iulian Onofrei
2
最新版本更新:SDImageCache *imageCache = [SDImageCache sharedImageCache]; [imageCache clearMemory]; [imageCache clearDiskOnCompletion:^(){}]; - Виктор Иванов

10

找到问题的来源。看起来我被SDImageCache中使用的Singleton模式所欺骗了。用于UIImageView的扩展的缓存是由SDWebImageManager控制的,它具有SDImageCache的实例变量。如果您想清除扩展名的缓存,则必须调用其imageCache的方法,例如clearDisk和clearMemory。


无法调用clearcache方法。[[SDWebImageManager sharedManager] clearCaches]。我尝试了这个,但它会崩溃。请帮帮我。 - Suraj Shinde
3
@SurajShinde,SDImageCache没有这样的方法,当然会崩溃。请使用[[[SDWebImageManager sharedManager] imageCache] clearDisk];[[[SDWebImageManager sharedManager] imageCache] clearMemory]; - Eugene
谢谢,实际上我正在使用旧的SDwebcache,它没有imageCache实例。 - Suraj Shinde
SDWebImageManager 的实例变量 imageCache 只是返回 [SDImageCache sharedImageCache]。请查看 createCache 方法:https://github.com/rs/SDWebImage/blob/master/SDWebImage/SDWebImageManager.m - Artem M

2

仅有以下代码适用于我的环境:Swift 5.0、 Xcode 11、iOS 13、SDWebImage pod 5.0。

 SDWebImageManager.shared.imageCache.clear(with: .all) {
        print("deleted all")
 }

在这里,您可以选择像 SDImageCacheType.disk, SDImageCacheType.memory, SDImageCacheType.disk 这样的选项。

如果您想从缓存中删除特定的图像,请使用以下命令:

SDWebImageManager.shared.imageCache.removeImage(forKey: "url of image", cacheType: .all)

1
这也适用于Swift 4,但是:SDWebImageManager.shared()?.imageCache.removeImage(forKey: "url of image") - Alessandro Porro
在SDWebImage 5.x中,应使用SDImageCache.shared.clearMemory()而不是其他方法。 - malcopolocei

-2

图标可以在服务器端更改,

因此您需要每次刷新缓存后重新加载。

如果您正在使用最新的SDWebImage框架(5.12.x),

您可以像这样调用它,

[imgView sd_setImageWithURL:[NSURL URLWithString:urlStr] placeholderImage:[UIImage imageNamed:@"xxx" options:SDWebImageRefreshCached];

于220112进行编辑。


-2
除了SDImageCache方法,我强烈建议您检查您的图像URL。在我的情况下,我尝试了每种图像缓存方法,但内存问题仍然存在。崩溃主要发生在iPhone 4s上,因为硬件无法处理它。
主要问题是URL和符号编码! 例如,请查看这些网址:第一个网址使用“&amp” ,而第二个网址则没有。由于和符号,我的JSON库无法读取宽度,宽度值会比应该高得多。这就是为什么我有内存问题的原因。
1)/select.php?imageid=101961221 "&amp" ;width=100 "&amp" ;isWatermarked=true 2)/select.phpimageid=101961221&width=100&isWatermarked=true 此外,最新版本的SDWebImage库已经包括UIImageView+WebCache.h类,可以很好地处理缓存问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接