iOS 組件化學習

蘑菇街的方案: 蘑菇街組件化的技術方案
對應的demo

上面的反駁 Casa提出了不同意見,下半部分是下面蘑菇街修改的回應
對應的demo

蘑菇街的修改 自己方案做了進一步優(yōu)化

大佬Bang的總結1 梳理總結

大佬mrpeak的總結2 iOS組件化方案

阿里的方案(有參考casa)casa對此的評價是?:用更臃腫的體量做了同樣的事情

以下是看完上面文章的總結

  • iOS組件化的方式:

1. catagory(Casa稱之為target - action方式)

方式為:

【模塊編寫對應的中間層catagory - 中間層 - 模塊調(diào)用catagory的方法】

catagory有兩種方式:

  1. runtime,通過字符串映射獲取類,用NSMethodSignature傳遞多個參數(shù)
  2. 由模塊創(chuàng)立者管理,該引入的類引入,寫法跟常規(guī)的類調(diào)用一樣,以model代替dictionary作為參數(shù)傳遞

catagory可以引伸出的protocol方式:

【模塊編寫對應的catagory 和protocol - 中間層 - 模塊引入protocol,調(diào)用catagory的方法】

這樣@import module后使用protocol才能敲出protocol的方法,邏輯分工更加清晰

2. url

通過【模塊注冊url的操作block -中間層以url為key緩存block- 模塊調(diào)用url調(diào)用block】

url只有一種方式:

字符串做key,dictionary做參數(shù),無法傳遞復雜參數(shù)

url可以引出protocol:

【模塊注冊protocol -中間層以protocol 為key緩存實現(xiàn)了協(xié)議方法的Class- 模塊通過中間層獲取Class調(diào)用協(xié)議方法】

其實就基本等價于catagory的protocol方式

區(qū)別:

  1. catagory的protocol是應用在中間層的,需要一行代碼用來創(chuàng)建帶protocol的中間層對象指針,一行代碼調(diào)用協(xié)議方法(也能以[(id<Protocol>)center method]的形式一行代碼完成),但由于XCode天生殘疾,OC里面Class<Protocol>是敲不出protocol里的類方法的(能編譯,但沒有提示),也就不能把中間層做成只有類方法的形式

  2. url的protocol是應用在模塊內(nèi)部對應的類,需要一行獲取類的代碼,一行創(chuàng)建實現(xiàn)協(xié)議的對象的代碼(也可以中間層直接返回創(chuàng)建好的對象),一行調(diào)用協(xié)議方法的代碼,寫多了還挺煩人的

進一步的總結

  • 不安全性:
  1. 以dictionary做參數(shù)能帶來最大化的解藕,但會導致模塊修改后運行時的錯誤無法被編譯時檢測,相比耦合性,穩(wěn)定性更重要,所以參數(shù)傳model會比dictionary更好

  2. 以url的形式也會帶來模塊修改后的運行時潛在錯誤,改成注冊protocol能減少安全性問題

3 以url的形式很容易被外部入侵,尤其是接入APPDelegate.openURL后,需要額外的安全處理(比如內(nèi)部調(diào)用的時候加key做判斷,過濾掉一些外部調(diào)用)

  • 書寫方便:

    使用純catagory不需要手動做指針變換,不需要獲取實現(xiàn)協(xié)議的類,不需要做其他額外的操作

  • 動態(tài)性:

    使用url的方式可以動態(tài)下發(fā)注冊,蘑菇街以此實現(xiàn)當線上模塊出現(xiàn)致命bug時可以動態(tài)切換到h5頁面


綜上,高安全性,書寫方便的做法:

  1. 建立一個中間層空類,每個模塊都需要引入這個類
  2. 使用類方法來處理通信減少書寫
  3. 使用純catagory,每個模塊內(nèi)部維護一份或多份中間層的catagory,該引用類就引用,怎么普通怎么寫,沒必要在模塊內(nèi)部用runtime,該暴露的model就暴露出來給其他模塊,建立一個總結多分catagory的頭文件,pod編寫時把catagory和總結頭文件暴露出來就行
  4. 使用的時候@import對應的模塊,直接敲出中間層的方法(但這樣就不適合OC++的項目了......只能單獨import總結頭文件)
  5. 必要時連push/present都可以在模塊內(nèi)部實現(xiàn),然后需要時用block返回結果model

純catagory接入動態(tài)性方案

當服務器下發(fā)到替換文件時(記得加密),在中間層主類中使用runtime把對應的catagory替換成打開網(wǎng)頁,具體參考Aspects jrswizzle RSSwizzle等Method Swizzling的第三方

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

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

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