一、内存OOM问题

运用 UIImage.animatedImage(with:duration:) 办法:UIImage 类提供了一个便利的办法来加载并处理 GIF 图画,该办法能够将 GIF 图画转换为 UIImage 的动画表明。这种办法能够有用地管理内存,并且不需要手动处理每一帧的图画。但会存在内存问题,UIImage(contentsOfFile:) 虽然不会立即放入内存中,但显现时还是会加载到内存中。

if let gifURL = Bundle.main.url(forResource: "example", withExtension: "gif") {
    let gifData = try? Data(contentsOf: gifURL)
    let gifImage = UIImage.animatedImage(with: gifData)
    imageView.image = gifImage
}

很多的GIF会导致OOM问题,一旦运用超越体系的阈值,就会溃散。

二、运用FLAnimatedImageView能够有用的处理GIF内存暴涨的问题

  • FLAnimatedImageView 运用渐进式解码:FLAnimatedImageView 运用渐进式解码来加载 GIF 图片。渐进式解码答应在图片没有彻底加载时就开始显现并逐渐添加清晰度。这意味着 FLAnimatedImageView 能够在加载 GIF 图片的一起,逐帧渲染和显现动画,而不需要等候整个 GIF 图片加载完结。这关于大型 GIF 图片特别有利,因为能够明显下降初次加载的延迟,并提高用户体会。
  • 内存优化:FLAnimatedImageView 在加载和显现大型 GIF 图片时进行了内存优化。它只会将当前帧所需的数据加载到内存中,并在显现下一帧时释放之前的帧数据,然后防止占用过多的内存。这有助于在加载大型 GIF 图片时下降内存运用,减少内存压力和 OOM 问题。

三、让FLAnimatedImageView支持网络GIF

FLAnimatedImageView 是用于显现 GIF 动画的 FLAnimatedImage 库中的特别控件,它并不直接用于加载网络图片,但咱们能够扩展办法为其添加加载网络图片的功能。

import FLAnimatedImage
import Kingfisher
extension FLAnimatedImageView {
    func setGifImage(withURL url: URL) {
        // 运用 Kingfisher 加载网络图片
        self.kf.setImage(with: url, completionHandler: { result in
            switch result {
            case .success(let value):
                // 成功加载图片,value.image 是 UIImage 类型
                // 将加载的图片转换为 FLAnimatedImage 类型
                let animatedImage = FLAnimatedImage(animatedGIFData: value.image.kf.gifRepresentation())
                // 在 FLAnimatedImageView 中显现 GIF 动画
                self.animatedImage = animatedImage
            case .failure(let error):
                // 加载图片失败,处理过错
                print("Error loading image: (error)")
            }
        })
    }
}

上述办法使用Kingfisher不只添加了缓存,还能后直接显现来自网络的GIF图片。

四、测验效果

整体内存能够下降70%,CPU在敏捷滑动时动摇较大,大概为本来的1-2倍,但是中止滑动时下降为本来的50%左右。由于现在iPhone手机的CPU普遍较好,而内存较低;所以这种用CPU缓解内存压力的办法是可行的。