2019-04-01 ios单图缓存的实现,按比例显示图片

2019-04-01  本文已影响0人  Daniel梁

需求:我们微博的Status出来的时候,有些时候是只有一张图片,这时候我们需要按照比例去显示这张图片,即长图就显示细长,短图就扁一点,为了让视图变化更加多样!

像蘑菇街等app,他们会使用瀑布流去显示图片,及一个界面有多种图片比例组成,每次进来的排版不一样,让人觉得眼前一亮。他们就有专门的后台,可以连图片比例一起传输给前端。

如果要我们自己实现的话怎么做呢

思路:我们可以提前缓存好图片到本地(在布局开始之前),然后布局的时候拿到本地缓存的图片,并给根据图片设置size。

为了保证图片一起缓存之后再去调用布局操作,我们使用GCD的Group模式,即每添加一个任务进group里面,就要在完成调用leave函数退出group,只有当group为空的时候才算完成,这就达到了控制任务同时完成的操作

           let group = DispatchGroup.init()
          //print("开始缓存")
          StatusList.forEach {
            //拿到单张图片的微博,否则继续往下寻找
           if $0.thumbnails?.count == 1 {
            //进组
            group.enter()
            //print("开始缓存单图 : \($0.thumbnails![0].absoluteString)")
            //缓存
            SDWebImageManager.shared().loadImage(with: $0.thumbnails![0],
                                                 options: [SDWebImageOptions.refreshCached,
                                                           SDWebImageOptions.retryFailed],
                                                 progress:nil,
                                                 completed: { (image, _, _, _, _, _) in
                                                    if let image = image ,
                                                        let data = UIImage.pngData(image)(){
                                                       dataLength += data.count
                                                    }
                                                    //出组
                                                    group.leave()
            })
            }
        }
        group.notify(queue: DispatchQueue.main) {
//            print("缓存完成")
//            print("数据长度\(dataLength/1024)")
//             print("缓存图像的地址:\(NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last!)")
//finish这个闭包就是用来通知外部更新布局
            finished(true)
        }

我们可以在控制台输出的地方,拿到沙盘地址,进入library下的cache,就可以看到我们缓存的图片


屏幕快照 2019-04-01 下午7.22.08.png

可以看到SDWebImage框架会在我们下载图片的时候自动帮我们缓存图片到磁盘,我们在更新布局的时候就可以通过SDWebImage提供的接口去取缓存的图片了。

if let url = viewModel?.thumbnails?.first?.absoluteString {
//这里的key是URL的绝对字符
          let image = SDWebImageManager.shared().imageCache?.imageFromCache(forKey: url)
                size = image!.size
            }

可以看到SDWebImage是通过MD5加密文件夹名字的,我们只需要提供URL地址就可以

下面进行验证,我们取第一张图片的URL

屏幕快照 2019-04-01 下午7.34.28.png

在命令行中输入 : MD5 -s URL地址 就可以转化出对应的加密数字串


[图片上传中...(屏幕快照 2019-04-01 下午7.34.28.png-c56ebb-1554118498718-0)]

通过数据串我们找到了对应的URLImage


屏幕快照 2019-04-01 下午7.30.15.png
上一篇下一篇

猜你喜欢

热点阅读