美文网首页
2019-04-01 ios单图缓存的实现,按比例显示图片

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

作者: Daniel梁 | 来源:发表于2019-04-01 19:37 被阅读0次

    需求:我们微博的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

    相关文章

      网友评论

          本文标题:2019-04-01 ios单图缓存的实现,按比例显示图片

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