APP本地圖片較多,每次查詢圖片都要消耗24ms左右,導致點選tabbar
的時候都要等上七八百ms,有的頁面甚至要1s,用instruments
中的Time Profiler
工具查詢之後發現頁面viewdidload
大部分的時間都花在了查詢圖片上,所以這次針對查詢圖片做了初步優化。
優化前:
優化前tabbar
的點選事件著實比較尷尬,點選的時候卡頓非常明顯。
優化後(順帶把didfinishlaunching優化了一下):
優化後把每個tabbar
對應的viewController
的初始化速度控制在了100ms之內,點選之後沒有明顯的卡頓,基本達到預期。
核心程式碼:
建立一個序列佇列,然後非同步開啟子執行緒進行耗時操作,最後回到主執行緒非同步更新UI。
+ (void)childThreadOperation:(childThreadOperation)chileThreadOperation mainThreadOperation:(mainThreadOperation)mainThreadOperation{
dispatch_queue_t queue = dispatch_queue_create("optimizeImageQueue", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
if(chileThreadOperation){
chileThreadOperation();
}
dispatch_async(dispatch_get_main_queue(), ^{
if(mainThreadOperation){
mainThreadOperation();
}
});
});
}
複製程式碼
附上github
地址:TFQImageOptimization 使用方法可以參考viewController
中的虛擬碼
Time Profiler
使用教程請參考我在簡書的文章:iOS 使用Instruments的Time Profiler工具進行app載入時間分析
載入圖片請參考我在部落格園的文章:如何獲得images.xcassets 中圖片的路徑?
同步非同步問題請參考我在掘金的文章:iOS執行緒、同步非同步、序列並行佇列
Tips:
imageNamed
方法在iOS9以後才是執行緒安全的,大家使用的時候要注意,iOS9以下可能會crash
或者返回nil