iOS?組件化初步構(gòu)思
一、iOS 組件化常用方式討論
使用openURL進(jìn)行組件的注冊(cè)和調(diào)用
App 啟動(dòng)時(shí)實(shí)例化各組件模塊,然后這些組件向 ModuleManager 注冊(cè) URL ,有些時(shí)候不需要實(shí)例化,使用 class 注冊(cè)。
當(dāng)組件A需要調(diào)用組件B時(shí),向 ModuleManager 傳遞 URL ,參數(shù)跟隨 URL 以 GET 方式傳遞,類似openURL 。然后由 ModuleManager 負(fù)責(zé)調(diào)度組件B,最后完成任務(wù)。
方案分析
第一步的問(wèn)題,在組件化的過(guò)程中,注冊(cè) URL 并不是充分必要條件,組件是不需要向組件管理器注冊(cè)Url的。而且注冊(cè)了 URL 之后,會(huì)造成不必要的內(nèi)存常駐,如果只是注冊(cè)Class,內(nèi)存常駐量就小一點(diǎn),如果是注冊(cè)實(shí)例,內(nèi)存常駐量就大了。
第二步。在 iOS 領(lǐng)域里,一定是組件化的中間件為 openURL 提供服務(wù),而不是 openURL 方式為組件化提供服務(wù)。
問(wèn)題在于無(wú)法表達(dá)非常規(guī)對(duì)象。
如果是傳遞復(fù)雜對(duì)象,如 UIImage ,只能做如下表達(dá)
[a openUrl:@"http://baidu.com/detail"
params:@{
@"id":"abc123",
@"type":"1",
@"image":[UIImage imageNamed:@"iOSImage"]}
]如果不像上面這么做,復(fù)雜參數(shù)和非常規(guī)參數(shù)就無(wú)法傳遞。如果這么做了,那么事實(shí)上這就是拆分遠(yuǎn)程調(diào)用和本地調(diào)用的入口了。
URL 注冊(cè)對(duì)于實(shí)施組件化方案是不必要的,且通過(guò) URL 注冊(cè)的方式形成的組件化方案,拓展性和可維護(hù)性都會(huì)被打折。
注冊(cè) URL 的目的其實(shí)是一個(gè)服務(wù)發(fā)現(xiàn)的過(guò)程,在 iOS 領(lǐng)域中,服務(wù)發(fā)現(xiàn)的方式是不需要通過(guò)主動(dòng)注冊(cè)的,使用 runtime 就可以了。另外,注冊(cè)部分的代碼的維護(hù)是一個(gè)相對(duì)麻煩的事情,每一次支持新調(diào)用時(shí),都要去維護(hù)一次注冊(cè)列表。如果有調(diào)用被棄用了,是經(jīng)常會(huì)忘記刪項(xiàng)目的。runtime 由于不存在注冊(cè)過(guò)程,那就也不會(huì)產(chǎn)生維護(hù)的操作,維護(hù)成本就降低了。
二、對(duì)組件化的構(gòu)思

以上方式主要是基于 Mediator 模式和 Target-Action 模式,中間采用了 Runtime 來(lái)完成調(diào)用。這套組件化方案將遠(yuǎn)程應(yīng)用調(diào)用和本地應(yīng)用調(diào)用做了拆分,而且是由本地應(yīng)用調(diào)用為遠(yuǎn)程應(yīng)用調(diào)用提供服務(wù),與常用方案正好相反。
調(diào)用方式
先說(shuō)本地應(yīng)用調(diào)用,本地組件A在某處調(diào)用
[[Mediator sharedInstance] performTarget:targetName action:actionName params:@{…}]向 Mediator 發(fā)起跨組件調(diào)用,Mediator 根據(jù)獲得的 target 和 action 信息,通過(guò) Objective-C 的 runtime 轉(zhuǎn)化生成 target 實(shí)例以及對(duì)應(yīng)的 action 選擇子,然后最終調(diào)用到目標(biāo)業(yè)務(wù)提供的邏輯,完成需求。
在遠(yuǎn)程應(yīng)用調(diào)用中,遠(yuǎn)程應(yīng)用通過(guò) openURL 的方式,由iOS系統(tǒng)根據(jù) info.plist 里的 scheme 配置找到可以響應(yīng) URL 的應(yīng)用,應(yīng)用通過(guò) AppDelegate 接收到URL之后,調(diào)用 Mediator 的 openUrl: 方法將接收到的URL信息傳入。當(dāng)然, Mediator 也可以用 openUrl:options: 的方式順便把隨之而來(lái)的option 也接收,這取決于你本地業(yè)務(wù)執(zhí)行邏輯時(shí)的充要條件是否包含 option 數(shù)據(jù)。傳入 URL 之后,Mediator 通過(guò)解析 URL ,將請(qǐng)求路由到對(duì)應(yīng)的 target 和 action ,隨后的過(guò)程就變成了上面說(shuō)過(guò)的本地應(yīng)用調(diào)用的過(guò)程了,最終完成響應(yīng)。
以上就是iOS 組件化初步構(gòu)思的詳細(xì)內(nèi)容,更多關(guān)于ios組件化常用方式的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章。也希望大家可以多多關(guān)注腳本之家,后續(xù)我們將帶來(lái)更精彩的更新!
相關(guān)文章
Objective-C編程中語(yǔ)句和變量的一些編寫(xiě)規(guī)范建議
這篇文章主要介紹了Objective-C編程中語(yǔ)句和變量的一些編寫(xiě)規(guī)范建議,包括三目運(yùn)算符和錯(cuò)誤處理等方面,以及對(duì)變量命名的書(shū)寫(xiě)建議,需要的朋友可以參考下2016-04-04
iOS APP中保存圖片到相冊(cè)時(shí)崩潰的解決方法
下面小編就為大家分享一篇iOS APP中保存圖片到相冊(cè)時(shí)崩潰的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12
iOS9中的WebKit 與 Safari帶來(lái)的驚喜
這篇文章主要介紹了iOS9中的WebKit 與 Safari帶來(lái)的驚喜的相關(guān)資料,需要的朋友可以參考下2015-11-11
iOS開(kāi)發(fā)之tableView點(diǎn)擊下拉擴(kuò)展與內(nèi)嵌collectionView上傳圖片效果
這篇文章主要介紹了iOS開(kāi)發(fā)之tableView點(diǎn)擊下拉擴(kuò)展與內(nèi)嵌collectionView上傳圖片效果的相關(guān)資料,需要的朋友可以參考下2016-04-04
iOS簡(jiǎn)單登錄LoginViewController、注冊(cè)RegisterViewController等功能實(shí)現(xiàn)方法
這篇文章主要為大家詳細(xì)介紹了iOS簡(jiǎn)單登錄LoginViewController、注冊(cè)RegisterViewController、UcenterViewController功能實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09
iOS自定義雷達(dá)掃描擴(kuò)散動(dòng)畫(huà)
這篇文章主要為大家詳細(xì)介紹了iOS自定義雷達(dá)掃描擴(kuò)散動(dòng)畫(huà),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10
ios動(dòng)態(tài)設(shè)置lbl文字標(biāo)簽的高度
本文給大家分享的是ios動(dòng)態(tài)設(shè)置lbl文字標(biāo)簽的高度寬度的方法,一共給大家匯總了3種方法,小伙伴們根據(jù)自己的項(xiàng)目需求自由選擇。2015-05-05

