中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

一款輕量級的 iOS 圖像緩存
來源:易賢網(wǎng) 閱讀:1673 次 日期:2015-05-08 14:39:04
溫馨提示:易賢網(wǎng)小編為您整理了“一款輕量級的 iOS 圖像緩存”,方便廣大網(wǎng)友查閱!

我們的 iOS 應(yīng)用都包含了大量的圖像。創(chuàng)建富有吸引力的視圖,主要依賴于大量的裝飾圖片,所有這些首先必須從遠程服務(wù)器獲取。如果每次打開應(yīng)用都要從服務(wù)器一次又一次的獲取每個圖像,那么用戶體驗肯定達不到好的效果,所以本地緩存遠程圖像是非常有必要的。

版本1-尋找一張圖片,并從磁盤上讀取它

我們的第一個圖片緩存是簡單但是有效的。從緩存中尋找每一個我們曾經(jīng)訪問過的圖片,用遠程的URL作為緩存的鍵值。如果本地的磁盤緩存時有效的,從磁盤中讀取文件并創(chuàng)建UIImage,并立即返回。如果再磁盤上沒有找到文件,異步的從遠程URL獲取文件,緩存到磁盤,然后返回一個新建的UIImage。

目前這對于我們的使用是完全滿足了。但是它有一個不必要的弱點:每次緩存請求都需要從磁盤讀取圖片,性能都消耗在對磁盤的訪問和圖片文件的解碼上了。

版本 2 - 內(nèi)存緩存

謝天謝地,蘋果的UIImage有內(nèi)置的內(nèi)存緩存。所以,你只需修改一行代碼,圖片就能從磁盤緩存改為內(nèi)存緩存。

當你使用imageNamed:獲取UIImage的時候,它第一步就是檢查自己的內(nèi)存看看是否已經(jīng)加載過這個圖片。如果這樣,你不用任何系統(tǒng)花銷就能得到一個UIImage實例。所以把原本這樣的寫法替換掉:

return [UIImage imageWithContentsOfFile:[self absolutePathForURL:url]];

我們可以零花銷去訪問內(nèi)存緩存,用下面的代碼就可以了:

return [UIImage imageNamed:[self relativePathForURL:url]];

UIImage 會查找它的內(nèi)存緩存,如果找到,就會零消耗地返回這個照片. 如果沒有找到,這張照片就會從磁盤加載,消耗一定的系統(tǒng)性能。

版本3 —— 獲取隊列、數(shù)據(jù)預(yù)取和變量催促

當改進應(yīng)用程序設(shè)計時我們渴望更多的圖片元素,渴望更炫的畫面,更大的圖片,更多的圖片。

讓這些大圖盡可能快的顯示在屏幕上對用戶體驗來說是至關(guān)重要的,而只是簡單地在每次需要顯示的時候去緩存當中抓取圖片數(shù)據(jù)是不能夠解決問題的。大圖需要更多的時間才能從網(wǎng)絡(luò)上加載回來,并且一次請求太多的圖片會導(dǎo)致所有圖片都來不及加載。需要仔細考慮什么時候去檢查緩沖當中有無圖片數(shù)據(jù)以及什么時候從網(wǎng)絡(luò)上抓取圖片。我們需要預(yù)緩存和抓取列陣。

快速隊列和慢速隊列

我們設(shè)置了兩個隊列,一個串行,一個并行。在屏幕上被迫切要求的圖片進入并行隊列(fastQueue),可能晚點才需要的圖片進入串行隊列(slowQueue)。

就UITableView的實現(xiàn)而言,這意味著在屏幕上的表格單元從fastQueue獲取圖片, 每個關(guān)閉的屏幕行的圖片從slowQueue預(yù)加載。

現(xiàn)在不需要處理圖片

假設(shè)我們要從服務(wù)器上請求包含30條事件的一頁資訊回來,一旦這些內(nèi)容請求回來時我們就可以排隊等待預(yù)取其中的每一張圖。

- (void)pageLoaded:(NSArray *)newEvents {

for (SGEvent *event in newEvents) {

[SGImageCache slowGetImageForURL:event.imageURL thenDo:nil];

}

}

slowGetImageForURL:這個方法將圖片添加到slowQueue這個隊列當中,允許它們在不阻塞網(wǎng)絡(luò)通信的前提下被一張一張的取出來。

thenDo:這個代碼塊在這里是沒有被實現(xiàn),是因為我們目前還不需要對圖片做任何事情。所有我們需要做的就是確保它們在本地磁盤緩存當中,并且隨時準備在屏幕上滑動表格時來使用。

現(xiàn)在就要處理圖片

顯示在屏幕上的表格希望立即顯示它們的圖片,所以在table cell子類當中實現(xiàn):

- (void)setEvent:(SGEvent *)event {

__weak SGEventCell *me = self;

[SGImageCache getImageForURL:event.imageURL thenDo:^(UIImage *image) {

me.imageView.image = image; }

];

}

getImageForURL:這個方法將抓取圖片的過程添加到fastQueue這個隊列當中,意味著只要iOS系統(tǒng)允許,它們會并行被地執(zhí)行。如果抓取圖片的過程已經(jīng)存在于slowQueue隊列當中,它會被移動到fastQueue隊列中,從而避免重復(fù)請求。

一直異步

等等,getImageForURL:不是一個異步方法嗎?如果你明知道圖片已經(jīng)在緩存中,但是卻不想在主線程上立即使用它嗎?直覺告訴你那是錯誤的。

從磁盤上加載圖片太費資源,同樣解壓圖片也會費很多資源。可以在滑動的過程當中進行配置和添加表格,這最后一件你想在滑動表格時做的事是很危險地,因為它會阻塞主線程,會有卡頓的現(xiàn)象出現(xiàn)。

使用getImageForURL:可以讓磁盤加載的動作脫離主線程,于是當thenDo:這個用于收尾工作的代碼塊執(zhí)行的時候它已經(jīng)有了一個UIImage實例,從而不會有滑動卡頓的危險。如果圖片已經(jīng)存在于本地緩存當中,用于收尾工作的代碼塊會在下一次運行周期執(zhí)行,并且用戶不會注意到兩者之間的差別。他們會注意到的是滑動不會卡頓了。

現(xiàn)在,不需要你快速執(zhí)行

如果用戶很快的滑動表格到底部,幾十或幾百個表格單元會出現(xiàn)在屏幕上,并向fastQueue請求圖片數(shù)據(jù),然后很快地從屏幕上消失。突然間這個并行地隊列會將大量實際上不再需要的圖片請求充斥進網(wǎng)絡(luò)。當用戶最終停止滑動時,那些當前屏幕上相應(yīng)的表格單元視圖會將它們的圖片請求至于那些并不急需的請求后面,因此網(wǎng)絡(luò)阻塞了。

這就是 wheremoveTaskToSlowQueueForURL:這個方法的產(chǎn)生的原因.

// a table cell is going off screen-

(void)tableView:(UITableView *)table

didEndDisplayingCell:(UITableViewCell *)cell

forRowAtIndexPath:(NSIndexPath*)indexPath {

// we don't need it right now, so move it to the slow queue

[SGImageCache moveTaskToSlowQueueForURL:[[(id)cell event] imageURL]];}

這確保在fastQueue中的只會有真正需要被快速執(zhí)行的任務(wù)。任何以前認為需要快速執(zhí)行但現(xiàn)在不需要的任務(wù)會被移至slowQueue中。

重點和選擇

已經(jīng)有相當多的iOS圖片緩存庫。它們中一些庫只針對某些應(yīng)用場景,一些庫提供了不同場景一定的可擴展性。我們的庫即沒有專門針對某些應(yīng)用場景,也沒有太多大而全的特性。針對我們的用戶我們有三類基本的重點:

重點 1: 最好的幀率

很多的庫都非常專注在這一點上,使用一些高度定制和復(fù)雜的方法,盡管基準沒有決定性地顯示這樣有效。我們發(fā)現(xiàn)最好的幀率由這些決定:

將對磁盤的訪問(并且?guī)缀跗渌乃校┟撾x主線程。

使用UIImage的內(nèi)存緩存來避免不必要的磁盤訪問和圖片解壓。

重點 2: 讓最最重要的圖片優(yōu)先顯示

大多數(shù)的庫都考慮讓隊列管理成為別人關(guān)心的事。對于我們的應(yīng)用,這幾乎是最重要的點。

讓正確的圖片在正確的時間顯示在屏幕上可以歸結(jié)為一個簡單的問題:“我們現(xiàn)在就需要它顯示還是過一會兒?”。那些需要立即顯示的圖片是并行加載地,而其它所有東西都被添加到串行隊列中。所有之前急迫的事但現(xiàn)在不急迫的話就會從fastQueue分到slowQueue中。并且當fastQueue在工作時,slowQueue是處于掛起狀態(tài)的。

這讓那些急需顯示的圖片可以單獨訪問網(wǎng)絡(luò),同時也確保了一張非急需顯示的圖片可以在過一會成為一張急需顯示的圖片,因為它已經(jīng)存到了緩存當中,隨時準備用于顯示。

重點 3: 盡可能簡單的API

大多數(shù)庫都做到了這一點。許多庫為了隱藏細節(jié)內(nèi)容而提供了UIImageView的分類,并且許多庫讓抓取一張圖片的流程變得盡可能的便利。針對我們經(jīng)常做的三件事,我們的庫選定了三個主要的方法:

快速抓到一張圖

__weak SGEventCell *me = self;[SGImageCache getImageForURL:event.imageURL thenDo:^(UIImage *image) { me.imageView.image = image;}];

排隊等待一張我們一會才需要的圖片

[SGImageCache slowGetImageForURL:event.imageURL thenDo:nil];

通知緩存一張急需顯示的圖已經(jīng)不需要立刻顯示

[SGImageCache moveTaskToSlowQueueForURL:event.imageURL];

結(jié)論

通過專注于預(yù)取,隊列管理,從主線程移除耗時的任務(wù),并且依賴于UIImage內(nèi)置的內(nèi)存緩存,我們努力從一個簡單的軟件包中得到好的結(jié)果。

更多信息請查看IT技術(shù)專欄

更多信息請查看技術(shù)文章
易賢網(wǎng)手機網(wǎng)站地址:一款輕量級的 iOS 圖像緩存

2026上岸·考公考編培訓(xùn)報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
亚洲男人av电影| 国产日韩欧美高清免费| 欧美日韩成人在线| 久久综合精品一区| 一区在线免费| 久久久久久综合| 黄色小说综合网站| 久久婷婷丁香| 亚洲国产精品久久久久久女王| 国产日韩在线一区| 久久久久久**毛片大全| 美女任你摸久久| 亚洲人永久免费| 欧美日韩高清在线观看| 亚洲在线视频| 国内精品视频在线观看| 美女91精品| 中日韩在线视频| 国产精品一区免费观看| 久久精品99国产精品日本| 精久久久久久| 欧美日韩国产精品自在自线| 亚洲女同精品视频| 在线免费不卡视频| 欧美亚一区二区| 久久婷婷国产综合国色天香| 亚洲九九爱视频| 国产日韩综合| 欧美激情小视频| 久久成人在线| 正在播放欧美视频| 娇妻被交换粗又大又硬视频欧美| 欧美高清视频在线播放| 亚洲欧美在线aaa| 亚洲精品网站在线播放gif| 国产精品久久久久77777| 久久综合影视| 午夜精品久久久久久久99樱桃| 极品尤物久久久av免费看| 欧美日韩专区在线| 国产精品一级二级三级| 美女脱光内衣内裤视频久久影院 | 国产精品成人观看视频免费| 午夜精品成人在线| 亚洲精品中文字幕在线观看| 国内精品久久久久久久果冻传媒 | 伊人成人在线视频| 欧美日韩日本国产亚洲在线| 久久久久久一区二区| 亚洲免费在线看| 99视频有精品| 亚洲黄色三级| 在线观看三级视频欧美| 欧美va亚洲va日韩∨a综合色| 性久久久久久久久久久久| 日韩视频中文字幕| 一区二区三区无毛| 国产欧美高清| 国产精品一区久久| 国产精品人成在线观看免费| 欧美日韩在线播放三区四区| 欧美久久视频| 激情91久久| 欧美主播一区二区三区美女 久久精品人 | 最新日韩中文字幕| 欧美久久久久久蜜桃| 久久伊人精品天天| 久久久欧美一区二区| 欧美在线免费播放| 欧美在线观看一区| 久久精精品视频| 久久久国产精品一区二区中文| 欧美亚洲综合在线| 久久久91精品国产| 六月婷婷一区| 欧美夫妇交换俱乐部在线观看| 欧美成在线观看| 欧美日韩在线一区二区三区| 国产精品网站在线播放| 国外成人在线视频| 亚洲精选一区| 亚洲欧美国产精品桃花| 久久精品免费看| 欧美黑人在线播放| 国产精品久久久久久久9999 | 欧美三级欧美一级| 国产精品一区免费在线观看| 国产乱码精品1区2区3区| 国产专区精品视频| 亚洲精品国产欧美| 亚洲一区二区在线观看视频| 欧美一区二区三区视频在线观看| 久久日韩粉嫩一区二区三区| 欧美精品福利| 国产精品五月天| 在线成人www免费观看视频| 尤物九九久久国产精品的分类| 亚洲日本成人| 亚洲麻豆av| 国产精品中文字幕在线观看| 国产一区二区无遮挡| 一区在线电影| 亚洲午夜久久久久久久久电影网| 欧美视频一区二区三区四区| 国产精品久久9| 国产精品盗摄久久久| 国产精品裸体一区二区三区| 亚洲高清视频的网址| 亚洲人成人77777线观看| 亚洲久色影视| 午夜精品免费在线| 久久精品国产v日韩v亚洲| 久久婷婷麻豆| 欧美激情一区二区久久久| 国产精品第13页| 欧美激情在线观看| 欧美色精品天天在线观看视频| 国产精品专区h在线观看| 黄色国产精品| 一区二区三区高清在线| 一区二区三区精品视频在线观看| 久久亚洲美女| 国产精品久久一卡二卡| 狠狠色丁香婷婷综合久久片| 一区二区欧美激情| 久久五月激情| 一区二区三区在线看| 一本色道久久88综合亚洲精品ⅰ| 久久爱另类一区二区小说| 欧美激情视频给我| 国产一区二区三区无遮挡| 99国产精品一区| 欧美日韩岛国| 亚洲国产精品欧美一二99| 久久超碰97中文字幕| 欧美日韩一区在线观看| 1204国产成人精品视频| 亚洲三级视频| 欧美国产91| 国内一区二区三区| 午夜日韩电影| 欧美三级乱码| 日韩视频永久免费观看| 欧美在线观看网址综合| 韩国一区二区三区美女美女秀| 一区二区久久久久久| 麻豆精品91| 国内精品免费在线观看| 午夜日本精品| 欧美成人日本| 一本大道久久a久久精品综合| 美日韩精品视频免费看| 国产亚洲欧美另类一区二区三区| 一区二区三区久久久| 欧美成人一区二区三区片免费| 国产在线精品二区| 久久久久久久成人| 国产伦精品一区二区三区在线观看| 一本久道综合久久精品| 欧美激情91| 99视频一区二区| 欧美激情综合网| 一区二区欧美视频| 欧美日本高清一区| 亚洲精品一区二区在线观看| 女生裸体视频一区二区三区| 影音先锋欧美精品| 久久久美女艺术照精彩视频福利播放| 亚洲大胆美女视频| 欧美刺激性大交免费视频| 亚洲经典三级| 欧美日韩不卡| 亚洲国内精品在线| 久久精品30| 午夜一区二区三视频在线观看| 国产精品欧美精品| 性欧美大战久久久久久久久| 国产精品日韩欧美一区| 久久精品国产亚洲a| 在线免费观看成人网| 欧美大片免费观看| 99精品欧美一区二区三区| 欧美日韩国产页| 亚洲少妇中出一区| 136国产福利精品导航| 欧美精品日韩精品| 亚洲在线第一页| 国语自产精品视频在线看| 欧美成人精品1314www| 国产日韩一区| 欧美视频一区在线| 久久国产夜色精品鲁鲁99| 亚洲国产精品成人综合| 欧美日韩日日骚| 亚洲一二三区在线| 日韩天堂在线视频| 国产日韩一区二区三区在线播放| 久久一区二区三区国产精品| 国产伦精品一区二区三区免费迷 | 有码中文亚洲精品|