2019-04-01 ios單圖緩存的實(shí)現(xiàn),按比例顯示圖片

需求:我們微博的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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容