问题描述
最近在做一个项目时,发现一个问题,就是用户更新头像后,后台保存的url地址没有变。但是使用了SDWebImage库来显示头像,导致用户更新头像后,再回到个人资料页面中,头像还是之前的头像,这是因为SDWebImage会先从内容或者本地中找有没有缓存,如果有就不再从服务器下载,直接显示。
尝试的解决办法
- 可以在用户更新头像成功后,清除所有缓存,
[[SDImageCache sharedImageCache] clearDiskOnCompletion:nil];
[[SDImageCache sharedImageCache] clearMemory];
但是这样处理,会有很大问题,如果其他地方有使用到SDWebImage来设置图片的话,那么都会重新从服务器下载图片,导致性能下降,并且消耗更多的用户流量,从而降低了用户体验。原因是清除了内存和本地磁盘所有的缓存,SDWebImage就会再次从服务下载一遍。所以这个方案pass掉 - 只删除头像地址对应的缓存图片
[[SDImageCache sharedImageCache] removeImageForKey:userAvatar withCompletion:nil]
这种方法相对于上面第一种,稍微好一点,不是将所有的图片缓存给清除掉 - 在设置图片方法里,对应的options参数,传一个SDWebImageFromLoaderOnly的枚举值,SDWebImage就会不管是否有缓存,都重新从服务器下载图片
- 如果后台设置了cache-control值,可以在设置图片时传一个SDWebImageRefreshCached参数,就可以在图片更新后,自动下载最新的图片来显示
- 我的项目的图片都是保存在阿里云服务器的,并且这个是由我客户端来上传的,只是上传成功后再由客户端将这个图片地址告诉我们后台,后台才会去重新保存,所以对应保存的图片地址客户端可以控制,在图片地址后面加UUID或者是时间戳,就可以用户每次更新后再回到个人资料页面中都能正常显示最新的图片