iOS 異步加載本地圖片

iOS 異步加載本地圖片

問題

當(dāng)某個界面使用系統(tǒng)API + (nullable UIImage *)imageNamed:(NSString *)name;加載了過多本地圖片資源時,不可避免的會產(chǎn)生卡頓感。

有過instrumentTime Profiler經(jīng)驗的同學(xué)應(yīng)該有數(shù)據(jù)上的直觀體驗长已,調(diào)用imageNamed:首次加載某張圖片,往往是最耗時的乘陪。

  1. I/O操作:首次加載本地圖片時,內(nèi)存中是沒有的雕擂,因此去磁盤中加載圖片啡邑。
  2. 解碼:解碼圖片,將位圖數(shù)據(jù)還原成原始像素數(shù)據(jù)井赌。

以上兩步都是imageNamed:方法在底層做的耗時操作谤逼。知道原因贵扰,那么方案也就有了,將以上操作放入到子線程中流部。

方案1

有些同學(xué)可能想戚绕,在子線程調(diào)用imageNamed:先提前加載一次圖片,并且系統(tǒng)會幫我們緩存枝冀,省事省力省心舞丛,美滋滋~但是這里有兩個坑:

  1. 線程安全問題,該方法在iOS9以后才線程安全果漾,也就是說iOS9以下版本使用有風(fēng)險球切;


    15486648779770.jpg
  2. 效率問題,將imageNamed:方法放入到子線程調(diào)用绒障,使用Time Profiler觀察會發(fā)現(xiàn)吨凑,該方法在子線程耗時比在主線程久的多,猜測為了保證線程安全户辱,底層很多加鎖的操作導(dǎo)致鸵钝;

方案2

那么美滋滋的不行,只能繞一點遠(yuǎn)路了庐镐;

加載圖片
// I/O將磁盤數(shù)據(jù)加載入內(nèi)存中恩商,NSData類型
+ (nullable instancetype)dataWithContentsOfFile:(NSString *)path;
// 將NSData類型的圖片數(shù)據(jù)轉(zhuǎn)為UIImage類型
- (nullable instancetype)initWithData:(NSData *)data scale:(CGFloat)scale NS_AVAILABLE_IOS(6_0);
解碼圖片

站在前人肩膀上敲代碼很方便,如果你的項目中使用了SDWebImage或YYImage的話焚鹊,可以直接調(diào)用它們框架內(nèi)部的解碼圖片方法;

YYImageDecoder類
- (instancetype)imageByDecoded;
SDWebImageDecoder類
+ (UIImage *)decodedImageWithImage:(UIImage *)image;

它們內(nèi)部邏輯相似:獲取imageA對象位圖的信息(透明通道韧献、縮放系數(shù)末患、寬高),創(chuàng)建渲染的上下文(CGBitmapContextCreate)锤窑,將位圖渲染在上下文中(CGContextDrawImage)璧针,在上下文中提取帶有位圖信息的imageB對象(CGBitmapContextCreateImage);

緩存

這樣子系統(tǒng)就不會幫我們緩存圖片了渊啰,因為需要我們自己管理緩存圖片探橱。
使用YYThreadSafeDictionary線程安全的容器,子線程保存下解碼后的圖片绘证。

以上幾步操作都是在子線程中隧膏,降低了主線程的占用,可以有效的解決由于加載本地圖片造成的卡頓問題嚷那。當(dāng)在子線程處理完圖片后胞枕,我們再切換到主線程,將圖片扔給使用方魏宽。

// 調(diào)用接口大致這樣
+ (void)asyncLoadImgWithimgName:(NSString *)imgName block:(void(^)(UIImage *image))block;
Github代碼 FGAsyncLoadImgUtil

以上就是項目中使用的一個小優(yōu)化方案腐泻,如果同學(xué)們其他idea决乎,希望不吝賜教。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末派桩,一起剝皮案震驚了整個濱河市构诚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌铆惑,老刑警劉巖范嘱,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鸭津,居然都是意外死亡彤侍,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門逆趋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盏阶,“玉大人,你說我怎么就攤上這事闻书∶澹” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵魄眉,是天一觀的道長砰盐。 經(jīng)常有香客問我,道長坑律,這世上最難降的妖魔是什么岩梳? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮晃择,結(jié)果婚禮上冀值,老公的妹妹穿的比我還像新娘。我一直安慰自己宫屠,他們只是感情好列疗,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著浪蹂,像睡著了一般抵栈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上坤次,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天古劲,我揣著相機(jī)與錄音,去河邊找鬼缰猴。 笑死绢慢,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播胰舆,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼骚露,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了缚窿?” 一聲冷哼從身側(cè)響起棘幸,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎倦零,沒想到半個月后误续,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡扫茅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年蹋嵌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片葫隙。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡栽烂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出恋脚,到底是詐尸還是另有隱情腺办,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布糟描,位于F島的核電站怀喉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏船响。R本人自食惡果不足惜躬拢,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望见间。 院中可真熱鬧聊闯,春花似錦、人聲如沸缤剧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽荒辕。三九已至,卻和暖如春犹褒,著一層夾襖步出監(jiān)牢的瞬間抵窒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工叠骑, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留李皇,地道東北人。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像掉房,于是被迫代替她去往敵國和親茧跋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359