iOS開發(fā):組件化封裝的嘗試

前言

上周嘗試著對新項(xiàng)目進(jìn)行了組件化的嘗試,開始選擇的是蘑菇街的方案(文章1枯芬、文章2)论笔,但是后來發(fā)現(xiàn)所有的組件都需要在+(void)load方法中注冊,這個讓我十分抵觸千所,然后因?yàn)轫?xiàng)目時間原因狂魔,就暫時方式了該方案。今天在看戴銘大神的博客是發(fā)現(xiàn)了基于CTMediator 擴(kuò)展的ArchitectureDemo淫痰,然后想起來casatwy大神當(dāng)時也有一套解決方案 iOS應(yīng)用架構(gòu)談 組件化方案最楷,今天就來學(xué)習(xí)一下,然后寫個練習(xí)的demo待错。

重點(diǎn)

本文內(nèi)容基本都是基于casatwy的文章在現(xiàn)有工程中實(shí)施基于CTMediator的組件化方案的練習(xí)籽孙,大家可以對照的看一下。

實(shí)現(xiàn)步驟

github上創(chuàng)建私有倉庫
WJPrivatePods.png
添加私有倉庫索引到本地
pod repo add WJPrivatePods https://github.com/pengwj/WJPrivatePods.git
在本地新建文件夾

在本地新建文件夾WJCTMediatorProject火俄,然后下載casatwy的源碼https://github.com/ModulizationDemo/MainProject文件夾中蚯撩。目錄結(jié)構(gòu)如下:

WJCTMediatorProject
└── MainProject

MainProject下載后,在MainProject目錄下執(zhí)行一下pod install拉取一下工程依賴的庫烛占,然后設(shè)置File->Workspace Setting->Build SystemLegacy Build System

配置私有庫文件工具腳本

由于casatwy提供的工具腳本沟启,github.com:casatwy/ConfigPrivatePod.git好像已經(jīng)無法拉取了忆家,所有后面需要我們手動配置私有庫迹炼。這里就先不配置了叛本。

創(chuàng)建私有Pod工程和Category工程

跟著casatwy的博客來,此次組件化的實(shí)施目標(biāo)就是把A業(yè)務(wù)組件化出來抑淫,首頁和B業(yè)務(wù)都還放在主工程胳搞。
為了把A業(yè)務(wù)抽出來作為組件卸例,我們需要為此做兩個私有Pod:A業(yè)務(wù)Pod(以后簡稱A Pod)、方便其他人調(diào)用A業(yè)務(wù)的CTMediator category的Pod(以后簡稱A_Category Pod)肌毅。

先創(chuàng)建A Pod

由于沒有私有庫配置腳本筷转,我們需要通過pod lib create NAME來新建A Pod,通過cd指令到Project目錄下悬而,然后執(zhí)行pod lib create NAME指令呜舒。

pod lib create A

A為我們的NAME。執(zhí)行后需要填寫一些信息笨奠,如下圖袭蝗。


pod lib create.png

此時你的主工程應(yīng)該就沒有A業(yè)務(wù)的代碼了,然后你的A工程應(yīng)該是這樣:


A工程
創(chuàng)建A_Categoty pod

重復(fù)上一步操作般婆,通過cd指令到Project目錄下到腥,然后執(zhí)行pod lib create NAME指令創(chuàng)建名為A_Categoty的pod。

配置A_Categoty

然后去A_Category下蔚袍,在Podfile中添加一行pod "CTMediator"乡范,在A_Category.podspec文件的后面添加s.dependency "CTMediator",然后執(zhí)行pod install --verbose。

接下來打開A_Category.xcworkspace篓足,把Example同目錄下的名為A_Category的目錄拖放到Xcode對應(yīng)的位置下段誊。


A_Category

然后在這里新建基于CTMediator的Category:CTMediator+A。最后你的A_Category工程應(yīng)該是這樣的:


CTMediator+A
配置主工程

去主工程的Podfile下添加pod "A_Category", :path => "../A_Category"來本地引用A_Category栈拖。
把主工程中的AViewController頭文件引用改成#import <A_Category/CTMediator+A.h>

然后執(zhí)行pod install拉取一下A_Category鏈接连舍。這個時候主工程依然無法編譯通過。

打開主工程涩哟,在Development Pods目錄下面找到CTMediator+A.h索赏,在里面添加一個方法:

- (UIViewController *)A_aViewController;

再去CTMediator+A.m中,補(bǔ)上這個方法的實(shí)現(xiàn):

- (UIViewController *)A_aViewController
{
    /*
        AViewController *viewController = [[AViewController alloc] init];
     */
    return [self performTarget:@"A" action:@"viewController" params:nil shouldCacheTarget:NO];
}

最后把主工程調(diào)用AViewController的地方改為基于CTMediator Category的實(shí)現(xiàn):

UIViewController *viewController = [[CTMediator sharedInstance] A_aViewController];
[self.navigationController pushViewController:viewController animated:YES];

編譯一下贴彼,如果能運(yùn)行成功潜腻,并出現(xiàn)下面界面,就表示已經(jīng)完成了對主工程的改造器仗。


主工程運(yùn)行結(jié)果
添加Target-Action融涣,并讓A工程編譯通過

打開A_Category工程和A工程,在A工程中創(chuàng)建一個文件夾:Targets精钮,然后看到A_Category里面有performTarget:@"A"威鹿,所以我們新建一個對象,叫做Target_A轨香。
然后又看到對應(yīng)的Action是viewController忽你,于是在Target_A中新建一個方法:Action_viewController。這個Target對象是這樣的:

頭文件:
#import <UIKit/UIKit.h>

@interface Target_A : NSObject

- (UIViewController *)Action_viewController:(NSDictionary *)params;

@end

實(shí)現(xiàn)文件:
#import "Target_A.h"
#import "AViewController.h"

@implementation Target_A

- (UIViewController *)Action_viewController:(NSDictionary *)params
{
    AViewController *viewController = [[AViewController alloc] init];
    return viewController;
}

@end
添加B_Category

同上面創(chuàng)建A_Categoty pod配置A_Categoty的步驟臂容,CTMediator+B的實(shí)現(xiàn)如下:

//頭文件:
#import <CTMediator/CTMediator.h>
#import <UIKit/UIKit.h>

@interface CTMediator (B)

- (UIViewController *)B_viewControllerWithContentText:(NSString *)contentText;

@end

//實(shí)現(xiàn)文件:
#import "CTMediator+B.h"

@implementation CTMediator (B)

- (UIViewController *)B_viewControllerWithContentText:(NSString *)contentText
{
    /*
        BViewController *viewController = [[BViewController alloc] initWithContentText:@"hello, world!"];
     */
    NSMutableDictionary *params = [[NSMutableDictionary alloc] init];
    params[@"contentText"] = contentText;
    return [self performTarget:@"B" action:@"viewController" params:params shouldCacheTarget:NO];
}

@end

文件目錄如下:


B_Category

然后我們對應(yīng)地在A工程中修改頭文件引用為#import <B_Category/CTMediator+B.h>科雳,并且把調(diào)用的代碼改為:

    UIViewController *viewController = [[CTMediator sharedInstance] B_viewControllerWithContentText:@"hello, world!"];
    [self.navigationController pushViewController:viewController animated:YES];

再編譯一下,發(fā)現(xiàn)編譯依然失敗了脓杉,這是因?yàn)锳工程中沒有導(dǎo)入相關(guān)pod糟秘。打開A工程的Podfile文件,添加如下的配置項(xiàng)球散。然后執(zhí)行pod install

 //  后面的“path”需要注意一下蚌堵,這個需要根據(jù)你的項(xiàng)目情況配置
  pod "B_Category", :path => "../../B_Category"
// 這個是casatwy源碼中依賴的布局庫
  pod 'HandyFrame'
新增Target_B對象

打開主工程MainProject,然后新建Target_B對象

//Target_B頭文件:
#import <UIKit/UIKit.h>

@interface Target_B : NSObject

- (UIViewController *)Action_viewController:(NSDictionary *)params;

@end

//Target_B實(shí)現(xiàn)文件:
#import "Target_B.h"
#import "BViewController.h"

@implementation Target_B

- (UIViewController *)Action_viewController:(NSDictionary *)params
{
    NSString *contentText = params[@"contentText"];
    BViewController *viewController = [[BViewController alloc] initWithContentText:contentText];
    return viewController;
}

@end

然后編譯運(yùn)行一下MainProject,看看能不能成功跳轉(zhuǎn)沛婴,如果不能成功跳轉(zhuǎn)可以按照下面順序檢查一下Podfile文件吼畏。

// MainProject的Podfile文件
  pod 'HandyFrame'
  pod "A_Category", :path => "../A_Category"
  pod "B_Category", :path => "../B_Category"
  pod "A",:path => "../A"
  pod 'CTMediator'
// A工程的Podfile文件
  pod "B_Category", :path => "../../B_Category"
  pod 'HandyFrame'
// A_Category工程的Podfile文件
  pod 'A_Category', :path => '../'
  pod "CTMediator"
// B_Category工程的Podfile文件
  pod 'B_Category', :path => '../'
  pod "CTMediator"

這里先上傳一份未發(fā)版的工程文件,大家可以對照一下嘁灯。
https://github.com/pengwj/blogWork/blob/master/code/WJCTMediatorProject.zip

私有Pod發(fā)版

我們創(chuàng)建了三個私有Pod:A泻蚊、A_Category、B_Category丑婿,接下來我們要給這三個私有Pod發(fā)版性雄,發(fā)版之前去podspec里面確認(rèn)一下版本號和dependency没卸。
私有庫發(fā)版折騰失敗了,還在研究中秒旋。约计。。

推薦閱讀

iOS應(yīng)用架構(gòu)談 組件化方案
在現(xiàn)有工程中實(shí)施基于CTMediator的組件化方案
iOS關(guān)于CTMediator組件化實(shí)踐的詳解篇
iOS組件化開發(fā)之路(CTMediator)迁筛,涉及到cocoapods本地庫煤蚌、遠(yuǎn)程私有庫、遠(yuǎn)程公開庫

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末细卧,一起剝皮案震驚了整個濱河市尉桩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌贪庙,老刑警劉巖蜘犁,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異止邮,居然都是意外死亡这橙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門导披,熙熙樓的掌柜王于貴愁眉苦臉地迎上來析恋,“玉大人,你說我怎么就攤上這事盛卡。” “怎么了筑凫?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵滑沧,是天一觀的道長。 經(jīng)常有香客問我巍实,道長滓技,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任棚潦,我火速辦了婚禮令漂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘丸边。我一直安慰自己叠必,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布妹窖。 她就那樣靜靜地躺著纬朝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪骄呼。 梳的紋絲不亂的頭發(fā)上共苛,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天判没,我揣著相機(jī)與錄音,去河邊找鬼隅茎。 笑死澄峰,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的辟犀。 我是一名探鬼主播俏竞,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼踪蹬!你這毒婦竟也來了胞此?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤跃捣,失蹤者是張志新(化名)和其女友劉穎漱牵,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疚漆,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡酣胀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了娶聘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闻镶。...
    茶點(diǎn)故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖丸升,靈堂內(nèi)的尸體忽然破棺而出铆农,到底是詐尸還是另有隱情,我是刑警寧澤狡耻,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布墩剖,位于F島的核電站,受9級特大地震影響夷狰,放射性物質(zhì)發(fā)生泄漏岭皂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一沼头、第九天 我趴在偏房一處隱蔽的房頂上張望爷绘。 院中可真熱鬧,春花似錦进倍、人聲如沸土至。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽毙籽。三九已至,卻和暖如春毡庆,著一層夾襖步出監(jiān)牢的瞬間坑赡,已是汗流浹背烙如。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留毅否,地道東北人亚铁。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像螟加,于是被迫代替她去往敵國和親徘溢。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評論 2 345