Cell異步圖片加載優(yōu)化緩存機(jī)制詳解??

最近研究了一下UITbleView中異步加載網(wǎng)絡(luò)圖片的問題吁津,iOS應(yīng)用經(jīng)常會看到這種界面煤墙。
一個tableView上顯示一些標(biāo)題痢甘、詳情等內(nèi)容距误,在加上一張圖片簸搞。
這里說一下這種思路。
為了防止圖片多次下載深寥,我們需要對圖片做緩存攘乒,緩存分為內(nèi)存緩存與沙盒緩存,我們當(dāng)然兩種都要實現(xiàn)惋鹅。
由于tableViewCell是有重用機(jī)制的则酝,也就是說,內(nèi)存中只有當(dāng)前可見的cell數(shù)目的實例闰集,滑動的時候沽讹,新顯示cell會重用被滑出的cell對象。這樣就存在一個問題:
一般情況下在我們會在cellForRow方法里面設(shè)置cell的圖片數(shù)據(jù)源武鲁,也就是說如果一個cell的imageview對象開啟了一個下載任務(wù)爽雄,這個時候該cell對象發(fā)生了重用,新的image數(shù)據(jù)源會開啟另外的一個下載任務(wù)沐鼠,由于他們關(guān)聯(lián)的imageview對象實際上是同一個cell實例的imageview對象挚瘟,就會發(fā)生2個下載任務(wù)回調(diào)給同一個imageview對象。這個時候就有必要做一些處理饲梭,避免回調(diào)發(fā)生時乘盖,錯誤的image數(shù)據(jù)源刷新了UI。
所以在我們向下滑動tableview的時候我們需要手動去取消掉下載操作憔涉,當(dāng)用戶停止滑動订框,再去執(zhí)行下載操作。SDWebImage采用的也是這種策略兜叨。
很簡單我們只需要監(jiān)聽ScrollView的代理方法(tableview繼承自Scrollview)穿扳。


而SDWebImage才用的就是這種方式,所以在運行SDWebImage的demo的時候衩侥,可以看到,如果快速滑下去矛物,然后又滑回來的話茫死,圖片是過了一會才顯示出來,這是因為快速滑動的時候泽谨,舊數(shù)據(jù)源的下載任務(wù)被取消掉了璧榄。
/—————————————————————------------------------
下面介紹一下具體的思路。
異步下載圖片我們用的是NSOperation吧雹,并且創(chuàng)建一個全局的queue來管理下載圖片的操作骨杂。


另外需要兩個字典operations、images


在把圖片顯示到Cell上之前
先判斷內(nèi)存中(images字典中)有沒有圖片雄卷,
如果有搓蚪,則取出url對應(yīng)的圖片來顯示,
如果沒有丁鹉,再去沙盒緩存中查看妒潭,當(dāng)然存到沙盒中都是NSData。
如果沙盒緩存中有揣钦,我們?nèi)〕鰧?yīng)的數(shù)據(jù)給Cell去顯示
如果沙盒中也沒有圖片雳灾,我們先顯示占位圖片。再創(chuàng)建operation去執(zhí)行下載操作了冯凹。
當(dāng)然在創(chuàng)建operation之前谎亩,我們要判斷這個operation操作是否存在
這個時候就用到我們operations這個字典了.


如果沒有下載操作,我們才需要真正的去創(chuàng)建operation執(zhí)行下載宇姚。
創(chuàng)建好下載操作之后應(yīng)該把該操作存放到全局隊列中去異步執(zhí)行匈庭,同時把操作放入operations字典中記錄下來。


下載完成之后:
把下載好的圖片放到內(nèi)存中浑劳、同時存到沙盒緩存中
下面存放到沙盒中的代碼可以定義成宏阱持,具體可以看后面的樣例:


執(zhí)行完上面的操作之后回到主線程刷新表格,
從operations字典中移除下載操作(防止operations越來越大魔熏,同時保證下載失敗后衷咽,能重新下載)
[圖片上傳中。蒜绽。兵罢。(7)]

這里我們不用[self.tableView reloadata],因為會刷新整個cell滓窍,浪費性能。
當(dāng)然如果你的下載操作里面需要做的事情很多的時候巩那,可以考慮自定義operation吏夯。 由于我這里只是簡單的下載小圖就沒有自定義operation了此蜈。注意要自己創(chuàng)建自動釋放池。
另外清理緩存的功能也沒有做
有興趣的朋友可以自己嘗試下.
至此基本實現(xiàn)思路已經(jīng)完成了噪生,這時候你會發(fā)現(xiàn)其實真正在項目中,以上代碼并沒有什么卵用。因為這個操作够吩,SDWebImgae已經(jīng)都封裝好砍聊,用一句代碼就搞定了,并且這句代碼代表的內(nèi)容比上面的操作更加完善桨嫁。??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末植兰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子璃吧,更是在濱河造成了極大的恐慌楣导,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件畜挨,死亡現(xiàn)場離奇詭異筒繁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)巴元,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進(jìn)店門毡咏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人逮刨,你說我怎么就攤上這事呕缭。” “怎么了禀忆?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵臊旭,是天一觀的道長。 經(jīng)常有香客問我箩退,道長离熏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任戴涝,我火速辦了婚禮滋戳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘啥刻。我一直安慰自己奸鸯,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布可帽。 她就那樣靜靜地躺著娄涩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蓄拣,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天扬虚,我揣著相機(jī)與錄音,去河邊找鬼球恤。 笑死辜昵,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的咽斧。 我是一名探鬼主播堪置,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼张惹!你這毒婦竟也來了舀锨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤诵叁,失蹤者是張志新(化名)和其女友劉穎雁竞,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拧额,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡碑诉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了侥锦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片进栽。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖恭垦,靈堂內(nèi)的尸體忽然破棺而出快毛,到底是詐尸還是另有隱情,我是刑警寧澤番挺,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布唠帝,位于F島的核電站,受9級特大地震影響玄柏,放射性物質(zhì)發(fā)生泄漏襟衰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一粪摘、第九天 我趴在偏房一處隱蔽的房頂上張望瀑晒。 院中可真熱鬧,春花似錦徘意、人聲如沸苔悦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽玖详。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間竹宋,已是汗流浹背劳澄。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留蜈七,地道東北人。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓莫矗,卻偏偏與公主長得像飒硅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子作谚,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,500評論 2 359

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