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