iOS晉級知識匯總(六)框架和架構(gòu)

怎樣設(shè)計一個圖片緩存框架(基本框架)

  • Manager
  • 內(nèi)存緩存
  • 磁盤緩存
  • 網(wǎng)絡(luò)下載
  • CodeManager
    • 圖片解碼
    • 圖片壓縮/解壓縮
圖片緩存框架.png

圖片通過什么方式進(jìn)行讀寫,過程是怎么樣額?

  • 以圖片URL的單向Hash值作為key 來存儲到存儲框架中
    • 為什么要使用內(nèi)存為了提高系統(tǒng)的查找效率所以才要設(shè)置多級緩存,節(jié)省流量


      圖片緩存的過程.png

內(nèi)存的設(shè)計上需要考慮哪些問題

  • 存儲size
    • 隊列方式存儲圖片,先進(jìn)先出
    • 根據(jù)使用情況存儲10kb以下的 50個,100kb以下的20個,100kb以上的10個


      根據(jù)使用情況來設(shè)置size的大小.png
  • 淘汰策略
    • 先進(jìn)先出的淘汰策略
    • LRU 最近最久未使用算法, 如果30分鐘是否使用過
      • 定時檢查,優(yōu)化:每次進(jìn)行讀寫的時,前后臺切換也可以去檢查
    • 通過緩存大小清除

磁盤設(shè)計

  • 存儲方式的選擇
  • 大小限制(如100MB)
  • 淘汰策略(距今超過7天)

網(wǎng)絡(luò)設(shè)計

  • 圖片請求最大并發(fā)量
  • 請求超時策略
    • 重試機(jī)制
    • 請求優(yōu)先級

圖片解碼

不同格式的圖片,解碼采用什么方式來做?

  • 應(yīng)用策略模式對不同圖片格式進(jìn)行解碼

  • 在哪個階段做圖片解碼處理?

磁盤讀取之后網(wǎng)絡(luò)請求后進(jìn)行圖片解碼。

圖片緩存過程?

圖片緩存工作流程線程交互.png

怎么設(shè)計一個時長統(tǒng)計框架?

  • 記錄管理者
    • 記錄緩存模塊
      • 內(nèi)存緩存在程序崩潰的時候懟是怎么辦,
      • 磁盤來處理異常場景
      • 上傳器 本地時長數(shù)據(jù)上傳給server
    • 流式
  • 記錄器 (記錄的數(shù)據(jù)交給記錄管理者進(jìn)行管理)
    • 頁面式記錄器 用戶訪問一個頁面的時長
    • 流式記錄器 訪問新聞閱讀時長記錄
    • 自定義記錄器 橫條新聞播放有業(yè)務(wù)方控制
閱讀時長統(tǒng)計.png

為何要有不同類型的記錄器,你的考慮是什么?

  • 基于不同分類場景提供的關(guān)于記錄的封裝、適配

記錄的緩存*存儲

記錄的數(shù)據(jù)由于某些原因丟失,你怎么處理?

  • 定時寫磁盤,每次滿足多少條就存儲磁盤

關(guān)于延時上傳的具體場景有哪些?

  • 每滿多少條上傳
  • 前后臺切換
  • 無網(wǎng)到有網(wǎng)的變化

上傳時機(jī)是怎么樣把控的?

  • 立即上傳
  • 延遲上傳
  • 定時上傳

復(fù)雜頁面架構(gòu)總結(jié)

MVVM框架思想

  • View對MVVM有一個強引用,ViewModel作為view的成員變量,ViewModel可以通過block形式把輸出結(jié)果回傳給使用方,或者是RAC響應(yīng)式編程方來把對應(yīng)的輸出回傳給這個視圖
    • View包含ViewController
  • ViewModel對model有一個強引用,或者是成員變量,model可以用block或者代理會傳給Viewmodel
MVVM架構(gòu)圖.png

ReactNative的數(shù)據(jù)流思想

首先會反向回到根節(jié)點,通過自頂向下遍歷查找對應(yīng)打了臟標(biāo)記的節(jié)點,然后去更新對應(yīng)的視圖
任何一個子孫節(jié)點是沒法做自己的變化更新的。他必須把這個變化消息傳遞給根節(jié)點, 根節(jié)點自頂向下的順序去遍歷子孫節(jié)點,
從主動行為編程被動行為。

RN數(shù)據(jù)流思想.png

系統(tǒng)UIView更新機(jī)制的思想

微博正文頁,反向更新機(jī)制,實際上就是模擬了系統(tǒng)的UIView更新機(jī)制的思想,
UIView更新機(jī)制,就是UIView的繪制流程,調(diào)用UIView的setneedsplay只是給對應(yīng)視圖打了一個臟標(biāo)記,而它真正繪制的時候是在RunLoop將要結(jié)束時才進(jìn)行的實際繪制。view通過反向查找到對應(yīng)的ViewModel然后變更對應(yīng)的業(yè)務(wù)數(shù)據(jù),打臟標(biāo)記,然后在下次reload之前去反向更新從新走一遍RN的數(shù)據(jù)流來驅(qū)動UI的變化,借鑒了系統(tǒng)UIView更新機(jī)制的思想

或者是借鑒了AsyncDisplayKit的預(yù)排版思想

FaceBook的開源框架AsyncDisplayKit關(guān)于預(yù)排版的設(shè)計思想

預(yù)排版,也是解決了性能方面的問題,也是性能優(yōu)化的一種

客戶端整體架構(gòu)面試問題

如何自己設(shè)計客戶端的整體架構(gòu)

  • 獨立于App的通用層
    • 時長統(tǒng)計、崩潰統(tǒng)計、網(wǎng)絡(luò)的第三方庫
  • 通用的業(yè)務(wù)層
    • 自定義的當(dāng)下公司業(yè)務(wù)相關(guān)的控件
  • 中間層 協(xié)調(diào)解耦
  • 業(yè)務(wù)A、業(yè)務(wù)B、業(yè)務(wù)C、業(yè)務(wù)D 中間層就是為了解耦這些業(yè)務(wù)

完全單獨拿出來一個業(yè)務(wù)A就能直接運用

業(yè)務(wù)之間的解耦通信方式

  • OpenURL
  • 依賴注入方式

依賴注入

業(yè)務(wù)A需要使用業(yè)務(wù)C的一些某些模塊,業(yè)務(wù)C、業(yè)務(wù)A不產(chǎn)生依賴就可以解耦,那么可以使用中間層,業(yè)務(wù)A通過中間層獲取業(yè)務(wù)C的方法和成員變量
iOS使用的時候, 讓某一個業(yè)務(wù)方注冊一個protocol,注冊到中間層當(dāng)中,同時實現(xiàn)中間層的代理方法,來返回給中間層具體的一個實例對象
然后業(yè)務(wù)A在使用的時候,通過跟其他業(yè)務(wù)開發(fā)人員商量好的協(xié)議,再從中間層中通過某一個方法
獲取遵從某個協(xié)議的實例然后在業(yè)務(wù)A當(dāng)中,把這個實例當(dāng)作完全遵從這個協(xié)議的透明對象來使用,這樣就接觸了業(yè)務(wù)A和業(yè)務(wù)C的耦合稱之為依賴注入

總結(jié)

圖片緩存設(shè)計

閱讀時長統(tǒng)計

時長統(tǒng)計數(shù)據(jù)丟失率

復(fù)雜頁面架構(gòu)

客戶端整體架構(gòu)

上層可以依賴下層 下層不能依賴上層

業(yè)務(wù)解耦
OpenUrl
依賴注入

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

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

  • 注意:本文主講架構(gòu)框架相關(guān)面試問題,包括圖片緩存、閱讀時長統(tǒng)計、復(fù)雜頁面結(jié)構(gòu)、客戶端整體架構(gòu)。 問題: 架構(gòu)框架解...
    codeTao閱讀 317評論 0 1
  • 圖片緩存 怎樣設(shè)計一個圖片緩存框架 圖片管理者模塊:內(nèi)存緩存模塊、磁盤緩存模塊、網(wǎng)絡(luò)圖片下載模塊 圖片處理:圖片解...
    叔簡閱讀 511評論 0 5
  • 1.網(wǎng)絡(luò) 1.網(wǎng)絡(luò)七層協(xié)議有哪些? 物理層:主要功能:傳輸比特流;典型設(shè)備:集線器、中繼器;典型協(xié)議標(biāo)準(zhǔn)和應(yīng)用:V...
    _我和你一樣閱讀 3,911評論 1 38
  • UItableview相關(guān) 重用機(jī)制 通過下面方法得到cell: 一般在iOS中,tableview的重用機(jī)制,我...
    struggle3g閱讀 48評論 0 0
  • 客戶端整體架構(gòu) 1 獨立于App的通用層(時長統(tǒng)計 網(wǎng)絡(luò)請求 )2 通用業(yè)務(wù)層(本公司通用的組件等)3 中間層(用...
    紅燒大雞腿閱讀 1,643評論 1 0

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