iOS進(jìn)階系列之調(diào)優(yōu)篇

(原文地址](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ò)安全。

  1. 根據(jù)用戶所在的2G/3G/4G/Wi-Fi的網(wǎng)絡(luò)環(huán)境來(lái)下發(fā)不同的配置,包括超時(shí)參數(shù)及圖片大小;
  2. 增加網(wǎng)絡(luò)重發(fā)機(jī)制;
  3. 增加 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)先使用;
  4. 設(shè)置網(wǎng)絡(luò)優(yōu)先級(jí)和依賴;
  5. 圖片采用高性價(jià)比圖片 webp 格式,更節(jié)省流量,在 webview 中使用需要配合 URLProtocol 使用;
  6. 請(qǐng)求頭中增加ETag,必要時(shí) server 返回304 Not Modifed, 配合Cache-Control在什么條件下可以緩存,緩存時(shí)間多長(zhǎng);
  7. 在本地以二進(jìn)制緩存請(qǐng)求數(shù)據(jù),緩存時(shí)機(jī)及清理機(jī)制;
  8. http連接配合 socket 連接使用,在高實(shí)時(shí)交互性頁(yè)面里面采用 socket 連接;
  9. 防止 DNS 劫持,采用 https 連接,更進(jìn)一步可以在URLProtocol中攔截異常的域名或者ip, AFN中安全策略里,使用驗(yàn)證域名,本地證書與 server 證書對(duì)比。

界面流暢性

均衡 CPU GPU,不要阻塞主線程。

  1. 對(duì)象延遲創(chuàng)建;
  2. 避免調(diào)整視力層次,添加移動(dòng)視圖;
  3. 對(duì)象特別多銷毀時(shí)放到后臺(tái)線程;
  4. 文本計(jì)算,文本繪制放到后臺(tái)線程;
  5. 圖片解碼,在后臺(tái)線程先把圖片繪制到 CGBitmapContext 中,然后從 Bitmap 直接創(chuàng)建圖片;
  6. 圖像的繪制放到后臺(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)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容