我正在尝试下载和缓存122张webp(动画)图像,然后使用ReusableCell将它们显示在collectionView中。
当我使用webp图像时,我感到目前没有太多可以使用的库。我发现唯一支持动画的动画是SDWebImage。
我浏览了所有带有标签“ SDWebImage”的帖子,并看到了一些类似的答案问题,但没有一个帮助我到达想要的位置。
好,现在输入一些代码。
我将这个带有url:s的二维数组用于不同的图像以测试图像加载
var images: [[URL]] = [[URL(string: "img00")!, URL(string: "img01")!], [URL(string: "img10")!, URL(string: "img11")!]]
其背后的原因是因为我的collectionView有2个部分和2行atm。
要能够使用webp,我首先在viewDidLoad中添加WebPCoder
override func viewDidLoad() {
let WebPCoder = SDImageWebPCoder.shared
SDImageCodersManager.shared.addCoder(WebPCoder)
}
正如您可以在下面看到的,我将sd_setImage与url:s之一一起使用, 如果我正确理解,将首先检查是否已缓存该图像,否则它将开始下载该图像,然后对其进行缓存。
正在下载图像的同时,我正在显示一个占位符图像。
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: CollectionViewCell.reuseID, for: indexPath) as? CollectionViewCell else {
return UICollectionViewCell()
}
let url = images[indexPath.section][indexPath.row]
cell.profileImage?.sd_setImage(with: url, placeholderImage: UIImage(named: "placeholderImg.png"))
return cell
}
现在解决我遇到的问题。
在SDWebImageView上阅读文档时,这就足够了。 (除非我错过了什么)
几秒钟后,每个单元将开始将其映像更新为下载的映像。逐一。完成所有4张图像通常需要大约4-5秒。
现在,当我转到另一个视图时,然后再次返回。似乎根本没有负载。我相信这是因为SDWebImage将每个图像保存到其内存缓存中。
现在,如果我完全杀死该应用程序并重新启动它 仍然需要4到5秒钟的时间才能重新加载图像。
我不确定是否要重新下载它们,或者库是否需要这么长时间才能从磁盘缓存中获取图像。
我想完成的任务如下:
用户首次启动该应用,并显示欢迎视图。
在应用程序下载完所有图片(例如122张图片)后,用户无法关闭welcomeView。
下载完所有图像后,我会显示collectionView视图 并且所有图像都已经加载了。
下一次,用户启动该应用程序,但我不希望该应用程序再次下载所有图像,它应立即从缓存中填充图像。或至少很快。我可以再次使用“ welcomeView”,但时间不长。
我试图通过使用SDWebImagePrefetcher来实现这一目标。
(图像与之前的二维数组相同)
SDWebImagePrefetcher
.shared
.prefetchURLs(
images as [URL],
progress: nil,
completed: { finished, skipped in
// Navigate to view with collectionView
}
)
这需要花费几秒钟,但是collectionView会立即显示图像。
但是我不相信它从磁盘缓存或任何缓存中获取图像。它只是再次下载图像并将其放入“临时内存缓存”中。
如果我完全关闭该应用程序,则再次相同。
所以我的问题是,我应该如何处理这样的事情?我是在正确的轨道上还是我完全错了?
对我来说,只是感觉图像没有保存到磁盘缓存中,只是暂时保存在内存中。
SDWebImage是否适合此库,还是我应该使用另一个库/自己构建?
感谢您阅读我的问题。希望我能从这篇文章或一些指导中得到一些答案。