本文主要講述了25個增強iOS應用程序性能的提示和技巧的初級篇,希望對大家有所幫助。
不要阻塞主線程
永遠都不要在主線程做繁重的任務。因為UIKit的左右任務都在主線程中進行,例如繪制、觸摸管理和輸入響應。
在主線程做所有任務的風險是:如果你的代碼阻塞了主線程,那麼程序將出現反應遲鈍。這回招致用戶在App Store上對程序的差評!
在執行I/O操作中,大多數情況下都會祖塞主線程,這些操作需要從讀寫外部資源,例如磁盤或者網絡。
關於網絡操作可以使用NSURLConnection的如下方法,以異步的方式來執行:
+ (void)sendAsynchronousRequest:(NSURLRequest *)request queue:(NSOperationQueue *)queue completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*))handler
或者使用第三方框架,例如AFNetworking。
如果你需要做一些其它類型開銷很大的操作(例如執行一個時間密集型的計算或者對磁盤進行讀寫),那麼就使用GCD(Grand Central Dispatch),或NSOperations 和 NSOperationQueues。
下面的代碼是使用GCD的一個模板:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// switch to a background thread and perform your expensive operation
dispatch_async(dispatch_get_main_queue(), ^{
// switch back to the main thread to update your UI
});
});
如上代碼,為什麼在第一個dispatch_async裡面還嵌套了一個dispatch_async呢?這是因為關於UIKit相關的代碼需要在主線程裡面執行。
可以看看Ray Wenderlich中的教程:iOS中多線程和GCD—初級,以及Soheil Azarpour的如何使用NSOperations和NSOperationQueues教程。
6) 讓圖片的大小跟UIImageView一樣
1
確保圖片和UIImageView大小一致
如果需要將程序bundle中的圖片顯示到UIImageView中,請確保圖片和UIImageView的大小是一樣的。因為圖片的縮放非常耗費資源,特別是將UIImageView嵌入到UIScrollView中。
如果是從遠程服務中下載圖片,有時候你控制不了圖片的尺寸,或者在下載之前無法在服務器上進行圖片的縮放。這種情況,當圖片下載完之後,你可以手動進行圖片的縮放——做好是在後台線程中!——然後再在UIImageView中使用縮放過的圖片。
選擇正確的集合
選擇正確的集合
學習使用最適合的類或對象是編寫高效代碼的基礎。特別是在處理集合數據時,尤為重要。
蘋果的官網上有一篇文章:集合編程主題(Collections Programming Topics)——詳細的介紹了在集合數據中可以使用的類,以及什麼情況下使用哪個類。在使用集合時,每個開發者都應該閱讀一下這個文檔。
太長,不想閱讀(TLDR)?下面是常見集合類型的一個簡介:
•數組:是一個值按順序排列的一個列表。根據索引可以快速查找,不過根據值進行查找就比較慢,另外插入和刪除也比較慢。
•字典: 存儲鍵/值對。根據鍵可以快速查找。
•Sets: 是一個值無序排列的列表,根據值可以快速查找,另外插入和刪除也比較快。
8) 使用GZIP壓縮
使用GZIP壓縮
越來越多的程序依賴於外部數據,這些數據一般來自遠程服務器或者其它的外部APIs。有時候你需要開發一個程序來下載一些數據,這些數據可以是XML,JSON,HTML或者其它一些文本格式。
問題是在移動設備上的網絡是不確定的。用戶的設備可能在EDGE網絡一分鐘,然後接著又在3G網絡中。不管在什麼情況下,都不要讓用戶等待。
有一個可以優化的選擇:使用GZIP對網絡傳輸中的數據進行壓縮,這樣可以減小文件的大小,並加快下載的速度。壓縮對於文本數據特別有用,因為文本具有很高的壓縮比。
iOS中,如果使用NSURLConnection,那麼默認情況下已經支持GZIP壓縮了,並且基於NSURLConnection的框架頁支持GZIP壓縮,如AFNetworking。甚至有些雲服務提供商已經提供發送經壓縮過的響應內容,例如 Google App Engine。
以上就是小編為大家整理的25個增強iOS應用程序性能的提示和技巧的初級篇,希望對大家有所幫助。