(原文地址](http://wp.me/p7OxSd-5t)
iOS進階系列之調(diào)優(yōu)篇
上一篇文章iOS進階系列之基礎(chǔ)篇
講到了 iOS 必備的技能纤控。本文主要講調(diào)優(yōu)技能危喉,iOS中調(diào)優(yōu)可從以下方面:網(wǎng)絡(luò)優(yōu)化籍救、界面流暢性羽嫡、啟動時間进鸠、代碼解耦绽快、持續(xù)集成、動態(tài)化刁绒。
網(wǎng)絡(luò)優(yōu)化
網(wǎng)絡(luò)優(yōu)化可以從以下幾個方面著手:弱網(wǎng)環(huán)境闷营、網(wǎng)絡(luò)緩存、傳輸圖片格式知市、網(wǎng)絡(luò)安全傻盟。
- 根據(jù)用戶所在的2G/3G/4G/Wi-Fi的網(wǎng)絡(luò)環(huán)境來下發(fā)不同的配置,包括超時參數(shù)及圖片大谐跽莫杈;
- 增加網(wǎng)絡(luò)重發(fā)機制;
- 增加 DNS映射及緩存奢入,緩存中有 server的 ip 列表筝闹,該列表會有一定的機制去更新,也會有一定的機制去最優(yōu)化排序腥光,App 啟動后关顷,首次從緩存中取一個 ip 進行 tcp 連接,連接成功后會返回最適合用戶的 server ip武福,同時該 ip 被加入到server ip 列表中優(yōu)先使用议双;
- 設(shè)置網(wǎng)絡(luò)優(yōu)先級和依賴;
- 圖片采用高性價比圖片 webp 格式捉片,更節(jié)省流量平痰,在 webview 中使用需要配合 URLProtocol 使用;
- 請求頭中增加ETag伍纫,必要時 server 返回304 Not Modifed, 配合Cache-Control在什么條件下可以緩存宗雇,緩存時間多長;
- 在本地以二進制緩存請求數(shù)據(jù)莹规,緩存時機及清理機制赔蒲;
- http連接配合 socket 連接使用,在高實時交互性頁面里面采用 socket 連接良漱;
- 防止 DNS 劫持舞虱,采用 https 連接,更進一步可以在URLProtocol中攔截異常的域名或者ip, AFN中安全策略里母市,使用驗證域名矾兜,本地證書與 server 證書對比。
界面流暢性
均衡 CPU GPU患久,不要阻塞主線程椅寺。
- 對象延遲創(chuàng)建舶沿;
- 避免調(diào)整視力層次,添加移動視圖配并;
- 對象特別多銷毀時放到后臺線程;
- 文本計算高镐,文本繪制放到后臺線程溉旋;
- 圖片解碼,在后臺線程先把圖片繪制到 CGBitmapContext 中嫉髓,然后從 Bitmap 直接創(chuàng)建圖片观腊;
- 圖像的繪制放到后臺線程中,視圖混合算行,把需要顯示的圖形在后臺線程繪制為圖片梧油,避免使用圓角、陰影州邢、遮罩等屬性儡陨。
代碼解耦
嚴(yán)格按照 MVC,也會有一定的解耦量淌,如果頁面復(fù)雜骗村,可以用 MVVM,即 model--view--viewModel呀枢,這里的 model為瘦 model胚股,view 即常見的 view, viewModel 為 view 中所需要的數(shù)據(jù)做一次封裝裙秋。這里還缺少的一個為數(shù)據(jù)請求層琅拌,我們就叫 dataFetcher 吧,這樣我們的架構(gòu)是這樣的:Controller 持有 dataFetcher摘刑、viewModel进宝、view,dataFetcher負責(zé)拿到請求回來的原始數(shù)據(jù),之后把數(shù)據(jù)傳給 viewModel泣侮,viewModel 把數(shù)據(jù)加工成 view 所需要的數(shù)據(jù)后即彪,再 bind 到 view 上。一個示例 Controller 可以是這樣:
@implementation TestViewController
- (void)viewDidLoad {
_mineDataFetcher = [DMMineDataFetcher new];
@weakify_self
[self.mineDataFetcher requestMineDataWithCallback:^() {
@strongify_self
[self.mainView bindDataWithViewModel:[DMMineViewModel viewModelWithData:self.mineDataFetcher.allData]];
}];
}
這樣職責(zé)分工清楚活尊,Controller 中沒有冗余代碼隶校,dataFetcher 就充當(dāng)了 model 層中數(shù)據(jù)請求回來轉(zhuǎn)化為 model,view 只負責(zé)顯示蛹锰,給我什么數(shù)據(jù)就顯示什么深胳,viewModel 就負責(zé)轉(zhuǎn)化為 view 最適合的數(shù)據(jù),比如:數(shù)據(jù)返回了一個余額長整形铜犬,單位為分舞终,頁面中要顯示¥20.02元這樣的字樣轻庆,并且字體不一樣,這種轉(zhuǎn)化就交給 viewModel 吧敛劝。
(原文地址](http://wp.me/p7OxSd-5t)