100行代碼簡單封裝圖片緩存

雖然這個功能都被寫爛了绝葡,但反正有空带族,動手用Swift3.0稍微封裝了一下拗窃,100行不到搞定,簡單粗暴直接上代碼锌畸。

func getImage(with urlString:String,isDiskCache:Bool = false,timeout:TimeInterval = 10)
    {
        let path = NSSearchPathForDirectoriesInDomains(.cachesDirectory,.allDomainsMask, true)[0] + "/image.txt"
        
        let finish = { image in
            DispatchQueue.main.async{
                self.movieImg.image = image
            }
        }
        
        let handle = {
        
            if let url = URL(string: urlString)
            {
                URLSession.shared.downloadTask(with: URLRequest(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: timeout)){
                    location,response,error in
                    
                    if let fileUrl = location
                    {
                        do
                        {
                            let data = try Data(contentsOf: fileUrl)

                            //需要磁盤緩存
                            if isDiskCache
                            {
                                var dict = [String:Data]()
                                
                                
                                //先取一下取得出來就接著存
                                if let fileData = FileManager.default.contents(atPath: path)
                                {
                                    let unarchiver = NSKeyedUnarchiver(forReadingWith: fileData)
                                    
                                    if let temp = unarchiver.decodeObject(forKey: "imgData") as? [String:Data]
                                    {
                                        dict = temp
                                    }
                                }
                                
                                //合并數(shù)據(jù)
                                dict["\(url)"] = data
                                
                                //編碼
                                let fileData = NSMutableData()
                                let archiver = NSKeyedArchiver(forWritingWith: fileData)
                                archiver.encode(dict, forKey: "imgData")
                                archiver.finishEncoding()
                                
                                //覆蓋寫入
                                if !fileData.write(to:URL(fileURLWithPath: path, isDirectory: false), atomically: true)
                                {
                                    print("保存失敗")
                                }
                            }
                            
                            finish(UIImage(data:data))
                        }
                        catch
                        {
                            print(error)
                        }
                    }
                    
                }.resume()
            }
        }
        
        
        //磁盤緩存
        if isDiskCache
        {
            DispatchQueue.global().async{
                
                //文件磁盤緩存路徑下能取出來
                if let fileData = FileManager.default.contents(atPath: path)
                {
                    let unarchiver = NSKeyedUnarchiver(forReadingWith: fileData)
                    if let dict = unarchiver.decodeObject(forKey: "imgData") as? [String:Data],let data = dict["\(urlString)"]
                    {
                        finish(UIImage(data:data))
                    }
                    //1.文件壞了 2.沒有這個圖片的緩存 3.根本取不出來 --->乖乖下載
                    else
                    {
                        handle()
                    }
                    unarchiver.finishDecoding()
                }
                else
                {
                    handle()
                }
            }
        }
        //內(nèi)存緩存
        else
        {
            //內(nèi)存緩存會容易被刪除
            handle()
        }
    }

簡單解釋一下

  • handle閉包簡單封裝了一下涉及網(wǎng)絡(luò)請求的部分勇劣。finish閉包簡單封裝了一下回調(diào)部分,可以改寫這個閉包輕松改變回調(diào)內(nèi)容潭枣。
  1. 如果需要磁盤緩存,isDiskCache設(shè)置為true比默。(默認(rèn)為false)
  2. 默認(rèn)超時為10s

函數(shù)流程:

  1. 如果非磁盤緩存,則直接去handle,根據(jù)URL請求圖片并執(zhí)行回調(diào)
  • 如果需要磁盤緩存盆犁,先判斷有沒有緩存文件命咐,第一次肯定沒有,就需要去下載并緩存;
    如果有緩存文件蚣抗,就嘗試讀一下緩存侈百,沒有此圖片的緩存或文件讀取失敗 還是要去下載并緩存。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末翰铡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子讽坏,更是在濱河造成了極大的恐慌锭魔,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件路呜,死亡現(xiàn)場離奇詭異迷捧,居然都是意外死亡织咧,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門漠秋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笙蒙,“玉大人,你說我怎么就攤上這事庆锦⊥蔽唬” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵搂抒,是天一觀的道長艇搀。 經(jīng)常有香客問我,道長求晶,這世上最難降的妖魔是什么焰雕? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮芳杏,結(jié)果婚禮上矩屁,老公的妹妹穿的比我還像新娘。我一直安慰自己爵赵,他們只是感情好吝秕,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著亚再,像睡著了一般郭膛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上氛悬,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天则剃,我揣著相機(jī)與錄音,去河邊找鬼如捅。 笑死棍现,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的镜遣。 我是一名探鬼主播己肮,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼悲关!你這毒婦竟也來了谎僻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤寓辱,失蹤者是張志新(化名)和其女友劉穎艘绍,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秫筏,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡诱鞠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年挎挖,在試婚紗的時候發(fā)現(xiàn)自己被綠了零蓉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伺绽。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡断凶,死狀恐怖稿黍,靈堂內(nèi)的尸體忽然破棺而出落包,到底是詐尸還是另有隱情趣竣,我是刑警寧澤杏愤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布解寝,位于F島的核電站锚烦,受9級特大地震影響觅闽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜涮俄,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一蛉拙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧彻亲,春花似錦孕锄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至宙址,卻和暖如春轴脐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背抡砂。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工大咱, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人注益。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓碴巾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親丑搔。 傳聞我的和親對象是個殘疾皇子厦瓢,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,524評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)啤月,斷路器煮仇,智...
    卡卡羅2017閱讀 134,601評論 18 139
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件谎仲、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,033評論 4 62
  • 我是80后一個孩子的媽媽欺抗。每次陪著孩子坐在沙發(fā)上一起觀看生動有趣的動畫片時不禁總會想起自己小時候看的動畫片...
    詩一閑修閱讀 889評論 9 3
  • 早上失誤導(dǎo)致簽到發(fā)生小狀況,連累整個簽到成績强重,對不起大家绞呈。這幾天腦子有些漿糊了,事情一多就暈頭轉(zhuǎn)向间景,合理規(guī)劃時間還...
    4017b3bae81c閱讀 176評論 0 0