美文网首页
使用SDWebImage 加载GIF

使用SDWebImage 加载GIF

作者: 晨煜煌 | 来源:发表于2018-05-23 16:15 被阅读0次

      本文主要是因为在开发中产品要求控制gif图的重复次数,查了一些资料后,发现gif本身自己可以设置重复次数,所以可以要求UI设计师出图时设置上重复次数即可。

        那么 问题来了,我是用swift开发的,本来之前一直用的都是Kingfisher ,这个第三方很强大,什么都不用管就可以加载gif图,但是有个问题,gif图永远都是无限循环的,Kingfisher没有关注重复次数的问题(PS:已经在Kingfisher的github上提了issue了,可惜无人回应),无奈只好找替代的第三方SDWebImage

    SDWebImage 4.0 之后 加载gif图 必须安装FLAnimatedImageView这个第三方imageview,不能使用原生UIImageView(PS:人生到处都是坑!!!)

    CocoaPods 安装

    pod'SDWebImage'

    pod'SDWebImage/GIF'

    一般用法

    用 FLAnimatedImageView 代替 UIImageView,用法很简单,跟UIImageView一样(可能有不一样的,没深入研究)

    SDWebImage 给 FLAnimatedImageView 添加了异步加载 GIF 的方法,与异步加载静态图片一样

    FLAnimatedImageView.sd_setImage(with: url, completed: nil)

    如果显示少量的 GIF,这样写就ok了。但是,如果需要用 UITableView 或 UICollectionView 展示大量 GIF,这么写可能会有性能问题,滑动时发生顿卡。

    提升性能

    为了提高性能,可以指定 RunLoopMode,在 default mode 进行动画,在 tracking mode (比如 scroll view 滑动时) 停止动画

    FLAnimatedImageView.runLoopMode =RunLoopMode.defaultRunLoopMode.rawValue

    我的代码中,这么写还是会有顿卡。

    解决办法是,把 FLAnimatedImage 的实例化放到子线程中。可以直接修改 SDWebImage 的源码,但不建议这么做。比较好的办法是,给 FLAnimatedImageView 添加extension方法

    ````

    extension FLAnimatedImageView {

            func setImage(with url:URL?, placeholderImage:UIImage?) {

                sd_internalSetImage(with: url, placeholderImage: placeholderImage, options: SDWebImageOptions(rawValue:0), operationKey:nil, setImageBlock: { [weakself] (image, imageData)in

                    guardletstrongSelf =selfelse{return}

                    letimageFormat = NSData.sd_imageFormat(forImageData: imageData)

                    ifimageFormat == .GIF {

                        // Enter global queue

                        DispatchQueue.global(qos: .userInteractive).async { [weakself]in

                            // Create FLAnimatedImage in global queue

                            letanimatedImage = FLAnimatedImage(animatedGIFData: imageData)

                            DispatchQueue.main.async { [weakself]in

                                guardletstrongSelf =selfelse{return}

                                // Set image in main queue

                                strongSelf.animatedImage = animatedImage

                                strongSelf.image =nil

                            }

                        }

                    }else{

                        // Set image in main queue

                        strongSelf.image = image

                        strongSelf.animatedImage =nil

                    }

                    }, progress:nil, completed:nil)

            }

        }

    ````

    同样调用 sd_internalSetImageWithURL: 方法,只是修改 setImageBlock 参数,在子线程中创建 FLAnimatedImage,然后在主线程中设置图片。

    这个方法也适用于静态图片。这样写,UITableView 滑动就很流畅了。(PS:这个是别人教的,没验证过,仅供参考)

    相关文章

      网友评论

          本文标题:使用SDWebImage 加载GIF

          本文链接:https://www.haomeiwen.com/subject/rfwrjftx.html