(原文地址](http://wp.me/p7OxSd-5t)
iOS進(jìn)階系列之調(diào)優(yōu)篇
上一篇文章iOS進(jìn)階系列之基礎(chǔ)篇
講到了 iOS 必備的技能。本文主要講調(diào)優(yōu)技能,iOS中調(diào)優(yōu)可從以下方面:網(wǎng)絡(luò)優(yōu)化、界面流暢性、啟動(dòng)時(shí)間、代碼解耦、持續(xù)集成、動(dòng)態(tài)化。
網(wǎng)絡(luò)優(yōu)化
網(wǎng)絡(luò)優(yōu)化可以從以下幾個(gè)方面著手:弱網(wǎng)環(huán)境、網(wǎng)絡(luò)緩存、傳輸圖片格式、網(wǎng)絡(luò)安全。
- 根據(jù)用戶所在的2G/3G/4G/Wi-Fi的網(wǎng)絡(luò)環(huán)境來(lái)下發(fā)不同的配置,包括超時(shí)參數(shù)及圖片大小;
- 增加網(wǎng)絡(luò)重發(fā)機(jī)制;
- 增加 DNS映射及緩存,緩存中有 server的 ip 列表,該列表會(huì)有一定的機(jī)制去更新,也會(huì)有一定的機(jī)制去最優(yōu)化排序,App 啟動(dòng)后,首次從緩存中取一個(gè) ip 進(jìn)行 tcp 連接,連接成功后會(huì)返回最適合用戶的 server ip,同時(shí)該 ip 被加入到server ip 列表中優(yōu)先使用;
- 設(shè)置網(wǎng)絡(luò)優(yōu)先級(jí)和依賴;
- 圖片采用高性價(jià)比圖片 webp 格式,更節(jié)省流量,在 webview 中使用需要配合 URLProtocol 使用;
- 請(qǐng)求頭中增加ETag,必要時(shí) server 返回304 Not Modifed, 配合Cache-Control在什么條件下可以緩存,緩存時(shí)間多長(zhǎng);
- 在本地以二進(jìn)制緩存請(qǐng)求數(shù)據(jù),緩存時(shí)機(jī)及清理機(jī)制;
- http連接配合 socket 連接使用,在高實(shí)時(shí)交互性頁(yè)面里面采用 socket 連接;
- 防止 DNS 劫持,采用 https 連接,更進(jìn)一步可以在URLProtocol中攔截異常的域名或者ip, AFN中安全策略里,使用驗(yàn)證域名,本地證書與 server 證書對(duì)比。
界面流暢性
均衡 CPU GPU,不要阻塞主線程。
- 對(duì)象延遲創(chuàng)建;
- 避免調(diào)整視力層次,添加移動(dòng)視圖;
- 對(duì)象特別多銷毀時(shí)放到后臺(tái)線程;
- 文本計(jì)算,文本繪制放到后臺(tái)線程;
- 圖片解碼,在后臺(tái)線程先把圖片繪制到 CGBitmapContext 中,然后從 Bitmap 直接創(chuàng)建圖片;
- 圖像的繪制放到后臺(tái)線程中,視圖混合,把需要顯示的圖形在后臺(tái)線程繪制為圖片,避免使用圓角、陰影、遮罩等屬性。
代碼解耦
嚴(yán)格按照 MVC,也會(huì)有一定的解耦,如果頁(yè)面復(fù)雜,可以用 MVVM,即 model--view--viewModel,這里的 model為瘦 model,view 即常見的 view, viewModel 為 view 中所需要的數(shù)據(jù)做一次封裝。這里還缺少的一個(gè)為數(shù)據(jù)請(qǐng)求層,我們就叫 dataFetcher 吧,這樣我們的架構(gòu)是這樣的:Controller 持有 dataFetcher、viewModel、view,dataFetcher負(fù)責(zé)拿到請(qǐng)求回來(lái)的原始數(shù)據(jù),之后把數(shù)據(jù)傳給 viewModel,viewModel 把數(shù)據(jù)加工成 view 所需要的數(shù)據(jù)后,再 bind 到 view 上。一個(gè)示例 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 中沒(méi)有冗余代碼,dataFetcher 就充當(dāng)了 model 層中數(shù)據(jù)請(qǐng)求回來(lái)轉(zhuǎn)化為 model,view 只負(fù)責(zé)顯示,給我什么數(shù)據(jù)就顯示什么,viewModel 就負(fù)責(zé)轉(zhuǎn)化為 view 最適合的數(shù)據(jù),比如:數(shù)據(jù)返回了一個(gè)余額長(zhǎng)整形,單位為分,頁(yè)面中要顯示¥20.02元這樣的字樣,并且字體不一樣,這種轉(zhuǎn)化就交給 viewModel 吧。
(原文地址](http://wp.me/p7OxSd-5t)