亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

深入分析iOS應用中對于圖片緩存的管理和使用

2020-07-26 03:23:35
字體:
來源:轉載
供稿:網友

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

兩種方式加載本地圖片
1.通過imageNamed:方法加載圖片
用過這種方式加載圖片,一旦圖片加載到內存中,那么就不會銷毀,一直到程序退出。(也就是說imageNamed:會有圖片緩存的功能,當下次訪問圖片的時候速度會更快。)
用這種方式加載圖片,圖片的內存管理并不受程序員控制。

復制代碼 代碼如下:

UIImage *image = [UIImage imageNamed: @“image”]

的意思是創建一個UIImage對象,并不是說image這個本身就是一張圖片,而是image指向一張圖片。在創建這個對象的時候實際上并沒有把真正的圖片加載到內存里,而是等到用到圖片的時候才會加載。
如上例,如果把image對象設置為nil,如果是其它對象,那么沒有強指針指向一個對象,這個對象就會銷毀;但是即使image = nil,它會指向的圖片資源也不會銷毀。
2.通過imageWithContentsOfFile:方式加載圖片
使用這個方法加載圖片,當指向圖片對象的指針銷毀或指向其它對象,這個圖片對象沒有其它強指針指向,這個圖片對象會銷毀,不會一直在內存中停留。

因為沒有緩存,所以如果相同的圖片多次加載,那么也會有多個圖片對象來占用內存,而不是用緩存的圖片。

使用這個方法,需要file的全路徑(之前用NSString, NSArray之類的加載文件也是一樣的,比如stringWithContentsOfFile:,看到file就知道是需要傳入全路徑。)

復制代碼 代碼如下:

NSString *imagePath = [[NSBundle mainBundle] pathForResource:imageName ofType:@"png"];
UIImage *image = [UIImage imageWithContentsOfFile:imagePath];

注意如果圖片在Images.xcassets中,是不能使用這個方法的。所以說想要自己進行圖片的內存管理(不希望有緩存圖片),那么要將圖片資源直接拖入工程,而不是放在Images.xcassets中。


快速隊列和慢速隊列
我們設置了兩個隊列,一個串行,一個并行。在屏幕上被迫切要求的圖片進入并行隊列(fastQueue),可能晚點才需要的圖片進入串行隊列(slowQueue)。
就UITableView的實現而言,這意味著在屏幕上的表格單元從fastQueue獲取圖片, 每個關閉的屏幕行的圖片從slowQueue預加載。

現在不需要處理圖片

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

復制代碼 代碼如下:

- (void)pageLoaded:(NSArray *)newEvents {   
    for (SGEvent *event in newEvents) {       
       [SGImageCache slowGetImageForURL:event.imageURL thenDo:nil];   
    }
}

slowGetImageForURL:這個方法將圖片添加到slowQueue這個隊列當中,允許它們在不阻塞網絡通信的前提下被一張一張的取出來。
thenDo:這個代碼塊在這里是沒有被實現,是因為我們目前還不需要對圖片做任何事情。所有我們需要做的就是確保它們在本地磁盤緩存當中,并且隨時準備在屏幕上滑動表格時來使用。

現在就要處理圖片

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

復制代碼 代碼如下:

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

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

一直異步

等等,getImageForURL:不是一個異步方法嗎?如果你明知道圖片已經在緩存中,但是卻不想在主線程上立即使用它嗎?直覺告訴你那是錯誤的。
從磁盤上加載圖片太費資源,同樣解壓圖片也會費很多資源。可以在滑動的過程當中進行配置和添加表格,這最后一件你想在滑動表格時做的事是很危險地,因為它會阻塞主線程,會有卡頓的現象出現。
使用getImageForURL:可以讓磁盤加載的動作脫離主線程,于是當thenDo:這個用于收尾工作的代碼塊執行的時候它已經有了一個UIImage實例,從而不會有滑動卡頓的危險。如果圖片已經存在于本地緩存當中,用于收尾工作的代碼塊會在下一次運行周期執行,并且用戶不會注意到兩者之間的差別。他們會注意到的是滑動不會卡頓了。

現在,不需要你快速執行

如果用戶很快的滑動表格到底部,幾十或幾百個表格單元會出現在屏幕上,并向fastQueue請求圖片數據,然后很快地從屏幕上消失。突然間這個并行地隊列會將大量實際上不再需要的圖片請求充斥進網絡。當用戶最終停止滑動時,那些當前屏幕上相應的表格單元視圖會將它們的圖片請求至于那些并不急需的請求后面,因此網絡阻塞了。
這就是 wheremoveTaskToSlowQueueForURL:這個方法的產生的原因.

復制代碼 代碼如下:

// 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中的只會有真正需要被快速執行的任務。任何以前認為需要快速執行但現在不需要的任務會被移至slowQueue中。

重點和選擇

已經有相當多的iOS圖片緩存庫。它們中一些庫只針對某些應用場景,一些庫提供了不同場景一定的可擴展性。我們的庫即沒有專門針對某些應用場景,也沒有太多大而全的特性。針對我們的用戶我們有三類基本的重點:
重點 1: 最好的幀率
很多的庫都非常專注在這一點上,使用一些高度定制和復雜的方法,盡管基準沒有決定性地顯示這樣有效。我們發現最好的幀率由這些決定:
將對磁盤的訪問(并且幾乎其它的所有)脫離主線程。
使用UIImage的內存緩存來避免不必要的磁盤訪問和圖片解壓。

重點 2: 讓最最重要的圖片優先顯示
大多數的庫都考慮讓隊列管理成為別人關心的事。對于我們的應用,這幾乎是最重要的點。
讓正確的圖片在正確的時間顯示在屏幕上可以歸結為一個簡單的問題:“我們現在就需要它顯示還是過一會兒?”。那些需要立即顯示的圖片是并行加載地,而其它所有東西都被添加到串行隊列中。所有之前急迫的事但現在不急迫的話就會從fastQueue分到slowQueue中。并且當fastQueue在工作時,slowQueue是處于掛起狀態的。
這讓那些急需顯示的圖片可以單獨訪問網絡,同時也確保了一張非急需顯示的圖片可以在過一會成為一張急需顯示的圖片,因為它已經存到了緩存當中,隨時準備用于顯示。

重點 3: 盡可能簡單的API
大多數庫都做到了這一點。許多庫為了隱藏細節內容而提供了UIImageView的分類,并且許多庫讓抓取一張圖片的流程變得盡可能的便利。針對我們經常做的三件事,我們的庫選定了三個主要的方法:
快速抓到一張圖

復制代碼 代碼如下:

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

排隊等待一張我們一會才需要的圖片
復制代碼 代碼如下:

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

通知緩存一張急需顯示的圖已經不需要立刻顯示
復制代碼 代碼如下:

[SGImageCache moveTaskToSlowQueueForURL:event.imageURL];

結論

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲一区二区三区四区视频| 日本久久精品视频| 亚洲sss综合天堂久久| 欧美一级淫片videoshd| 亚洲图片制服诱惑| 日韩资源在线观看| 97久久久免费福利网址| 国产精品老牛影院在线观看| 久久久久久伊人| 亚洲视频精品在线| 91av在线影院| 深夜精品寂寞黄网站在线观看| 日韩中文在线中文网三级| 久久久精品亚洲| 欧美精品在线极品| 中日韩午夜理伦电影免费| 欧美大片网站在线观看| 亚洲免费精彩视频| 久久精品国产免费观看| 欧美乱大交xxxxx另类电影| 日韩视频在线免费| 九九久久久久久久久激情| 国产精品狠色婷| 久久久久中文字幕| 黑人巨大精品欧美一区二区三区| 77777亚洲午夜久久多人| 欧美精品在线第一页| 色偷偷88888欧美精品久久久| 91久久在线视频| 日韩欧美在线国产| 日韩av中文字幕在线免费观看| 亚洲视频精品在线| 成人免费激情视频| 成人疯狂猛交xxx| 中文字幕在线视频日韩| 欧美人与物videos| 亚洲欧美国产日韩中文字幕| 欧美影院在线播放| 亚洲人午夜精品免费| 欧美精品18videosex性欧美| 亚洲色图25p| 97精品在线视频| 91视频国产高清| 久久天天躁夜夜躁狠狠躁2022| 深夜福利日韩在线看| 在线一区二区日韩| 亚洲图片在线综合| 综合国产在线观看| 日韩成人在线视频网站| 国产精品久久av| 91美女片黄在线观看游戏| 午夜精品久久久久久久99热浪潮| 国产欧美日韩综合精品| 亚洲最大在线视频| 日韩欧美国产中文字幕| 亚洲一区二区在线| 中文字幕欧美日韩va免费视频| 亚洲欧美色婷婷| 中文字幕视频一区二区在线有码| 日韩影视在线观看| 久久精品视频va| 国产成人一区二区三区小说| 欧美在线xxx| 精品一区精品二区| 国产mv免费观看入口亚洲| 亚洲天堂影视av| 国产精品国产三级国产专播精品人| 国产精品人成电影| 欧美日韩亚洲国产一区| 国产亚洲精品久久久久久牛牛| 久久久久久久影视| 不卡av在线网站| 色偷偷av一区二区三区| 国产精品久久久久99| 亚洲精品一区中文字幕乱码| 亚洲自拍av在线| 亚洲国产97在线精品一区| 久久精品国产69国产精品亚洲| 国产精品电影网| www.亚洲一二| 日本亚洲欧美三级| 日韩免费高清在线观看| 欧美激情精品久久久久久黑人| 亚洲人成电影网站色| 狠狠色狠色综合曰曰| 尤物99国产成人精品视频| 欧美香蕉大胸在线视频观看| 国产精品99久久久久久久久久久久| 亚洲精品久久7777777| 国产精品成久久久久三级| 亚洲在线第一页| 欧美国产视频一区二区| 久久人人爽人人爽人人片亚洲| 日韩在线免费高清视频| 欧美成人剧情片在线观看| 亚洲人a成www在线影院| 91九色精品视频| 久久久久久久久久国产精品| 欧美性猛交xxxx乱大交| 在线观看欧美www| 日韩在线视频免费观看| 日韩va亚洲va欧洲va国产| 亚洲国产成人一区| 国产精品7m视频| 日韩成人av在线播放| 亚洲老头老太hd| 欧美孕妇孕交黑巨大网站| 久久久久久有精品国产| 蜜臀久久99精品久久久久久宅男| 97热精品视频官网| 亚洲精品国产精品乱码不99按摩| 欧美黑人性生活视频| 最近2019年手机中文字幕| 国产日韩欧美在线视频观看| 一区二区三欧美| 狠狠色噜噜狠狠狠狠97| www.欧美免费| 国产一区二区三区日韩欧美| 亚洲女人天堂视频| 日韩在线观看免费高清完整版| 亚洲成人999| 欧美中文在线观看国产| 精品久久中文字幕久久av| 亚洲国内高清视频| 精品久久久久久久久久国产| 久99九色视频在线观看| 久久久久久久爱| 国产区亚洲区欧美区| 成人福利网站在线观看11| 国产一区二区三区直播精品电影| 国产欧美精品一区二区三区介绍| 欧美精品免费在线| 国产精品一区二区三区久久| 毛片精品免费在线观看| 日韩成人高清在线| 欧美亚洲国产成人精品| 欧美日韩综合视频| 亚洲午夜未满十八勿入免费观看全集| 992tv成人免费影院| 亚洲午夜激情免费视频| 精品视频偷偷看在线观看| 欧美性极品xxxx娇小| xxxx性欧美| 亚洲影院污污.| 日韩中文字幕av| 欧美午夜精品久久久久久浪潮| 久久久久中文字幕2018| 久久久欧美精品| 久久6免费高清热精品| 91亚洲国产成人精品性色| 久久福利视频网| 岛国精品视频在线播放| 日韩的一区二区| 色婷婷亚洲mv天堂mv在影片| 日韩精品视频观看| 亚洲free嫩bbb| 欧美大片网站在线观看| 2019国产精品自在线拍国产不卡| 国产伦精品一区二区三区精品视频| 性欧美xxxx视频在线观看| 亚洲iv一区二区三区| 国产精品69久久久久| 欧美在线观看www| 91免费版网站入口|