iOS組件化

組件化

隨著代碼量程序和業(yè)務(wù)越來(lái)越多歪沃,最初的架構(gòu)不能適應(yīng)公司業(yè)務(wù)發(fā)展的速度竣蹦,解決辦法就是進(jìn)行項(xiàng)目的重構(gòu)筝野,前面的培訓(xùn)中介紹過(guò)單工程+MVC或單工程+MVVM等架構(gòu)晌姚,但是更加大型的項(xiàng)目,例如蘑菇街歇竟、淘寶挥唠,單工程的架構(gòu)是無(wú)法滿足架構(gòu)需求的,因此焕议,今天我們來(lái)了解一下組件化開(kāi)發(fā)宝磨。
本文主要介紹在登錄模塊組件化的基本流程以及遇到的一些困難和解決方案。
我理解的組件化有幾個(gè)原則盅安,組件內(nèi)部高聚合唤锉,組件之間無(wú)耦合,組件實(shí)現(xiàn)一個(gè)完整的功能以供外部調(diào)用别瞭。

中間件

在這次預(yù)研中窿祥,使用的是casa的中間件CTMediator,中間件采用CTMediator蝙寨,CTMediator主要采用target-action的調(diào)用方式晒衩。在我的理解中,target主要是指一整個(gè)模塊墙歪,如登錄模塊听系、用戶模塊、小游戲模塊虹菲,即時(shí)通訊模塊等等靠胜,action則為模塊內(nèi)部的調(diào)用方法,如獲取登錄界面、獲取注冊(cè)界面或者查詢信息等等浪漠。需要傳入的參數(shù)以param = demoParam的方式作為url的一部分傳入菠赚,在獲取到url后進(jìn)行url解析獲取具體執(zhí)行的方法。以前有讀過(guò)一篇文章提到:

在模塊內(nèi)部的界面跳轉(zhuǎn)也建議采用url轉(zhuǎn)發(fā)的模式郑藏,以便于外部可以直接使用url調(diào)用內(nèi)部界面。

雖然這個(gè)也不是很理解為什么...先暫且這么認(rèn)為吧瘩欺。

執(zhí)行target-action部分的代碼如下:

/*
 scheme://[target]/[action]?[params]
 
 url sample:
 aaa://targetA/actionB?id=1234
 */
- (id)performTarget:(NSString *)targetName action:(NSString *)actionName params:(NSDictionary *)params
{
    
    NSString *targetClassString = [NSString stringWithFormat:@"Target_%@", targetName];
    NSString *actionString = [NSString stringWithFormat:@"Action_%@:", actionName];
    
    Class targetClass = NSClassFromString(targetClassString);
    id target = [[targetClass alloc] init];
    SEL action = NSSelectorFromString(actionString);
    
    if (target == nil) {
        // 這里是處理無(wú)響應(yīng)請(qǐng)求的地方之一必盖,這個(gè)demo做得比較簡(jiǎn)單,如果沒(méi)有可以響應(yīng)的target俱饿,就直接return了歌粥。實(shí)際開(kāi)發(fā)過(guò)程中是可以事先給一個(gè)固定的target專門用于在這個(gè)時(shí)候頂上,然后處理這種請(qǐng)求的
        return nil;
    }
    
    if ([target respondsToSelector:action]) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
        return [target performSelector:action withObject:params];
#pragma clang diagnostic pop
    } else {
        // 這里是處理無(wú)響應(yīng)請(qǐng)求的地方拍埠,如果無(wú)響應(yīng)失驶,則嘗試調(diào)用對(duì)應(yīng)target的notFound方法統(tǒng)一處理
        SEL action = NSSelectorFromString(@"notFound:");
        if ([target respondsToSelector:action]) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
            return [target performSelector:action withObject:params];
#pragma clang diagnostic pop
        } else {
            // 這里也是處理無(wú)響應(yīng)請(qǐng)求的地方,在notFound都沒(méi)有的時(shí)候枣购,這個(gè)demo是直接return了嬉探。實(shí)際開(kāi)發(fā)過(guò)程中,可以用前面提到的固定的target頂上的棉圈。
            return nil;
        }
    }
}

登錄模塊組件

內(nèi)部需要集成普通登錄功能涩堤、第三方登錄功能、注冊(cè)功能和修改密碼功能分瘾,共四個(gè)部分胎围。對(duì)于普通登錄功能,通過(guò)網(wǎng)絡(luò)請(qǐng)求實(shí)現(xiàn)德召,對(duì)于第三方登錄功能白魂,在我們的項(xiàng)目中涉及到微信、QQ和新浪微博三種登錄方式上岗,集成第三方平臺(tái)時(shí)需要注意url type福荸、url scheme的配置,同時(shí)根據(jù)三個(gè)平臺(tái)的要求鏈接系統(tǒng)庫(kù)液茎。
調(diào)用登錄模塊時(shí)判斷是否已經(jīng)登錄過(guò)逞姿,若登錄過(guò)則直接跳轉(zhuǎn)到詳情頁(yè),未登錄則跳轉(zhuǎn)到登錄界面進(jìn)行登錄捆等,成功后跳轉(zhuǎn)到詳情頁(yè)滞造。

  • 普通登錄
  • 第三方登錄
  • 注冊(cè)
  • 修改密碼
登錄模塊的打包

登錄模塊在打包過(guò)程中遇到很多問(wèn)題,首先是第三方庫(kù)的打包栋烤,一開(kāi)始我的第三方登錄功能在cocoapods直接調(diào)用了shareSDK的第三方登錄谒养,打包成庫(kù)之后出現(xiàn)了平臺(tái)Connector庫(kù)的dylib not load,image not found的問(wèn)題,由于自己也不太懂庫(kù)的加載的問(wèn)題买窟,加上這個(gè)庫(kù)又不是自己寫的不好控制和修改丰泊,所以就放棄直接集成shareSDK的第三方登錄功能,采用自己實(shí)現(xiàn)的方式始绍,在寫模塊時(shí)包含第三方平臺(tái)瞳购,打包時(shí)不打包平臺(tái),調(diào)用時(shí)引用這三個(gè)平臺(tái)庫(kù)即可亏推。Q!吞杭!由于打包動(dòng)態(tài)庫(kù)方法不同盏浇,所以我在自己調(diào)用第三方平臺(tái)打包調(diào)用成功后又試了一次使用ShareSDK,結(jié)果成功了芽狗,所以可能是前面生成庫(kù)的時(shí)候?qū)戝e(cuò)绢掰,自己調(diào)用庫(kù)總是有各種各樣的問(wèn)題,所以我還是使用ShareSDK集成吧童擎。
打包庫(kù)的時(shí)候在LeoLei的這篇文章上找到了非常好的方法滴劲,解決了一連串問(wèn)題,掛出來(lái)表示超級(jí)感謝顾复!
還有一個(gè)記錄的小技巧哑芹,在創(chuàng)建Framework時(shí)的工程名和最后生成的framework名字可以不一致,設(shè)置方法為Build Setting中Basic一欄捕透,修改Product Name聪姿,之前記得怎么設(shè)置,后來(lái)忘記了乙嘀,所以記錄在這里以免又忘記末购。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市虎谢,隨后出現(xiàn)的幾起案子盟榴,更是在濱河造成了極大的恐慌,老刑警劉巖婴噩,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件擎场,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡几莽,警方通過(guò)查閱死者的電腦和手機(jī)迅办,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)章蚣,“玉大人站欺,你說(shuō)我怎么就攤上這事。” “怎么了矾策?”我有些...
    開(kāi)封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵磷账,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我贾虽,道長(zhǎng)逃糟,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任蓬豁,我火速辦了婚禮履磨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘庆尘。我一直安慰自己,他們只是感情好巷送,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布驶忌。 她就那樣靜靜地躺著,像睡著了一般笑跛。 火紅的嫁衣襯著肌膚如雪付魔。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天飞蹂,我揣著相機(jī)與錄音几苍,去河邊找鬼。 笑死陈哑,一個(gè)胖子當(dāng)著我的面吹牛妻坝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播惊窖,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼刽宪,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了界酒?” 一聲冷哼從身側(cè)響起圣拄,我...
    開(kāi)封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎毁欣,沒(méi)想到半個(gè)月后庇谆,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凭疮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年饭耳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片执解。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡哥攘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情逝淹,我是刑警寧澤耕姊,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站栅葡,受9級(jí)特大地震影響茉兰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜欣簇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一规脸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧熊咽,春花似錦莫鸭、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至衫仑,卻和暖如春梨与,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背文狱。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工粥鞋, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瞄崇。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓呻粹,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親苏研。 傳聞我的和親對(duì)象是個(gè)殘疾皇子尚猿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

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