需求:我們微博的Status出來(lái)的時(shí)候,有些時(shí)候是只有一張圖片,這時(shí)候我們需要按照比例去顯示這張圖片,即長(zhǎng)圖就顯示細(xì)長(zhǎng),短圖就扁一點(diǎn),為了讓視圖變化更加多樣!
像蘑菇街等app,他們會(huì)使用瀑布流去顯示圖片,及一個(gè)界面有多種圖片比例組成,每次進(jìn)來(lái)的排版不一樣,讓人覺(jué)得眼前一亮。他們就有專(zhuān)門(mén)的后臺(tái),可以連圖片比例一起傳輸給前端。
如果要我們自己實(shí)現(xiàn)的話(huà)怎么做呢
思路:我們可以提前緩存好圖片到本地(在布局開(kāi)始之前),然后布局的時(shí)候拿到本地緩存的圖片,并給根據(jù)圖片設(shè)置size。
為了保證圖片一起緩存之后再去調(diào)用布局操作,我們使用GCD的Group模式,即每添加一個(gè)任務(wù)進(jìn)group里面,就要在完成調(diào)用leave函數(shù)退出group,只有當(dāng)group為空的時(shí)候才算完成,這就達(dá)到了控制任務(wù)同時(shí)完成的操作
let group = DispatchGroup.init()
//print("開(kāi)始緩存")
StatusList.forEach {
//拿到單張圖片的微博,否則繼續(xù)往下尋找
if $0.thumbnails?.count == 1 {
//進(jìn)組
group.enter()
//print("開(kāi)始緩存單圖 : \($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("數(shù)據(jù)長(zhǎng)度\(dataLength/1024)")
// print("緩存圖像的地址:\(NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last!)")
//finish這個(gè)閉包就是用來(lái)通知外部更新布局
finished(true)
}
我們可以在控制臺(tái)輸出的地方,拿到沙盤(pán)地址,進(jìn)入library下的cache,就可以看到我們緩存的圖片

屏幕快照 2019-04-01 下午7.22.08.png
可以看到SDWebImage框架會(huì)在我們下載圖片的時(shí)候自動(dòng)幫我們緩存圖片到磁盤(pán),我們?cè)诟虏季值臅r(shí)候就可以通過(guò)SDWebImage提供的接口去取緩存的圖片了。
if let url = viewModel?.thumbnails?.first?.absoluteString {
//這里的key是URL的絕對(duì)字符
let image = SDWebImageManager.shared().imageCache?.imageFromCache(forKey: url)
size = image!.size
}
可以看到SDWebImage是通過(guò)MD5加密文件夾名字的,我們只需要提供URL地址就可以
下面進(jìn)行驗(yàn)證,我們?nèi)〉谝粡垐D片的URL

屏幕快照 2019-04-01 下午7.34.28.png
在命令行中輸入 : MD5 -s URL地址 就可以轉(zhuǎn)化出對(duì)應(yīng)的加密數(shù)字串

[圖片上傳中...(屏幕快照 2019-04-01 下午7.34.28.png-c56ebb-1554118498718-0)]
通過(guò)數(shù)據(jù)串我們找到了對(duì)應(yīng)的URLImage

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