iOS組件化(模塊化)實(shí)踐初探

1.背景

1.1 組件化目的

將一個(gè)復(fù)雜龐大的移動端工程,通過解耦重組組件的方式來提高開發(fā)效率枫耳。組件化不僅僅是把代碼分庫這么簡單乏矾,處理好各個(gè)組件之間的通信解耦是重點(diǎn)難點(diǎn)。

1.2 組件化優(yōu)點(diǎn)

1.組件化完成后迁杨,各個(gè)組件之間不會有任何直接依賴钻心,也就是說一個(gè)組件不會import另一個(gè)組件,各個(gè)組件之間的 Podfile 也無相互顯式依賴铅协,各個(gè)組件在編譯時(shí)也是完全是解耦的捷沸。加快了編譯速度,各個(gè)組件也可以單獨(dú)開發(fā)和測試狐史。
2.組件化對代碼的封裝性痒给、合理性都有較高要求,提升開發(fā)伙伴的設(shè)計(jì)能力预皇。
3.如果有新的App需要之前類似業(yè)務(wù)功能侈玄,可快速組裝成新App。

1.3 組件化缺點(diǎn)

組件化適合在迭代了很多版本后到某一時(shí)期吟温,出現(xiàn)了一些相對獨(dú)立的業(yè)務(wù)模塊的時(shí)候再引入。但此時(shí)因?yàn)榇a時(shí)間久遠(yuǎn)突颊,之前的開發(fā)伙伴也許不在崗位了鲁豪,解耦就比較復(fù)雜。并且由于工具和流程的復(fù)雜化律秃,導(dǎo)致團(tuán)隊(duì)之間協(xié)作的成本變高爬橡,某些情況下可能會導(dǎo)致開發(fā)效率下降。

1.4 實(shí)際業(yè)務(wù)分析

fcs項(xiàng)目現(xiàn)在越來越大棒动,并且有一些大且具體的業(yè)務(wù)模塊糙申,例如啟蒙、摩比船惨、AI在線課柜裸、大課后等×蝗瘢可以考慮組件化架構(gòu)方案「硗Γ現(xiàn)在各個(gè)模塊之間有一些依賴關(guān)系,使用組件化之后各個(gè)組件就只對中間層依賴怜浅。

2.組件通信方案

業(yè)界常用組件化方案:

2.1 路由URL跳轉(zhuǎn)方案

1)App之間跳轉(zhuǎn):
使用URL Scheme(舉例: weixin:)
使用Universal Links方式铐然。使我們的App通過HTTP鏈接來啟動App
2)native和h5跳轉(zhuǎn):
通過一個(gè)URL綁定一個(gè)頁面蔬崩,移動端通過URL打開相應(yīng)前端頁面。
3)native內(nèi)
給每個(gè)類設(shè)計(jì)url搀暑,通過key(url)沥阳,找類,跳轉(zhuǎn)

2.2 服務(wù)注冊方案

每個(gè)組件提供對外的服務(wù)協(xié)議聲明自点,調(diào)用方直接調(diào)用服務(wù)接口沪袭。具有“面向協(xié)議編程”思想,優(yōu)點(diǎn)是代碼自動補(bǔ)全和編譯時(shí)檢查有效樟氢,實(shí)現(xiàn)簡單冈绊。
業(yè)界成熟的開源庫是阿里的BeeHive

2.3 基于反射的遠(yuǎn)程調(diào)用方案

使用performSelector進(jìn)行消息傳遞埠啃,在runtime時(shí)期發(fā)送消息死宣,反射調(diào)用。缺點(diǎn)是有大量的硬編碼碴开,假如拼寫錯(cuò)誤的話毅该,在運(yùn)行時(shí)才能發(fā)現(xiàn),導(dǎo)致效率低潦牛、質(zhì)量低眶掌。
業(yè)界成熟的開源庫是CTMediator,對該方案進(jìn)行了優(yōu)化完善巴碗。

3.BeeHive 原理及實(shí)踐

github鏈接:BeeHive
(BeeHive:蜂窩朴爬。蜂窩是世界上高度模塊化的工程結(jié)構(gòu)肾筐,六邊形的設(shè)計(jì)能帶來無限擴(kuò)張的可能蒲障。

3.1 用法及代碼示例

組件側(cè)(BeeHiveBigClassExample):
1.創(chuàng)建protocol
//1. 創(chuàng)建 protocol。此protocol表示大課后組件(模塊)對外暴露的接口
class BigClassHomeViewControllerProtocol: NSObject, BHServiceProtocol {

// 接口:展示大課后首頁
static func showHomeView() {
}

}

2.創(chuàng)建impClass
//2. 創(chuàng)建 implementClass
class BigClassHomeViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()

  BHContext.shareInstance()?.serviceConfigName = "BeeHive.bundle/BHService"
  showHomeView()
}

func showHomeView() {
  print("大課后首頁该酗!")
}

}

3.設(shè)置protocol-impClass映射關(guān)系
三種方式:
1)使用BeeHive類的-[registerService:service:]
2)使用宏BeeHiveService
3)使用plist文件
該示例中是通過plist文件實(shí)現(xiàn)的:
//3. 設(shè)置protocol-impClass映射關(guān)系逸爵。使用plist文件注冊具滴,在初始化BeeHive時(shí)指定plist文件的路徑
BHContext.shareInstance()?.serviceConfigName = "BeeHive.bundle/BHService"

image.png

image.png

調(diào)用側(cè)(BeeHiveExample):
func bigClassBeeHive() {
// 調(diào)用服務(wù)
let BigClassHomeVC = BeeHive.shareInstance()?.createService(BigClassHomeViewControllerProtocol.self)
BigClassHomeVC.showHomeView()
}

4.CTMediator 原理及實(shí)踐

github鏈接: CTMediator

4.1 用法及代碼示例

組件側(cè)(CTMediatorAIClassExample)
**1.創(chuàng)建target-action****
//1. 創(chuàng)建target-action。類名必須以Target_開頭
class Target_AIClassViewController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()
Action_ShowAIClassHome()
}
//2. action的方法名必須以Action_開頭
func Action_ShowAIClassHome() {
print("AI在線課师倔!")
}
}

2. 創(chuàng)建CTMediator的分類,為了外部調(diào)用
import Foundation

let kTarget_Module = "Target_AIClassViewController"
let kTarget_Action = "Action_ShowAIClassHome"

extension CTMediator {
func showHome() {
let viewController = self.performTarget(kTarget_Module, action: kTarget_Action, params: [:], shouldCacheTarget: false)
return viewController
}
}

調(diào)用側(cè)(CTMediatorExample)
let vc = CTMediator.sharedInstance()?.Action_ShowAIClassHome()

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末构韵,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子趋艘,更是在濱河造成了極大的恐慌疲恢,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件致稀,死亡現(xiàn)場離奇詭異冈闭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)抖单,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門萎攒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來遇八,“玉大人,你說我怎么就攤上這事耍休∪杏溃” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵羊精,是天一觀的道長斯够。 經(jīng)常有香客問我,道長喧锦,這世上最難降的妖魔是什么读规? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮燃少,結(jié)果婚禮上束亏,老公的妹妹穿的比我還像新娘。我一直安慰自己阵具,他們只是感情好碍遍,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著阳液,像睡著了一般怕敬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上帘皿,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天东跪,我揣著相機(jī)與錄音,去河邊找鬼矮烹。 笑死越庇,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的奉狈。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼涩惑,長吁一口氣:“原來是場噩夢啊……” “哼仁期!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起竭恬,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤跛蛋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后痊硕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赊级,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年岔绸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了理逊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片橡伞。...
    茶點(diǎn)故事閱讀 40,133評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖晋被,靈堂內(nèi)的尸體忽然破棺而出兑徘,到底是詐尸還是另有隱情,我是刑警寧澤羡洛,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布挂脑,位于F島的核電站,受9級特大地震影響欲侮,放射性物質(zhì)發(fā)生泄漏崭闲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一威蕉、第九天 我趴在偏房一處隱蔽的房頂上張望刁俭。 院中可真熱鬧,春花似錦忘伞、人聲如沸薄翅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽翘魄。三九已至,卻和暖如春舀奶,著一層夾襖步出監(jiān)牢的瞬間暑竟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工育勺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留但荤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓涧至,卻偏偏與公主長得像腹躁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子南蓬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容