基于CTMediator的组件化方案

基于CTMediator的组件化方案

组件化方案:

总的来说做组件化,目前比较成熟的方案有两种:
1、基于CTMediator的组件化方案。
2、是类似于蘑菇街Protocol-Class,目前我所采用的是基于CTMediator的组件化方案,这里着重讲一下他的实现以及开发过程中所遇到的一些问题。

原理:

(1)CTMediator:CTMediator主要采用target-action的方式实现组件间解耦合,本身功能完全独立,不依赖任何组件模块。其原理是通过给组件包装一层wrapper来给外界提供服务,然后调用者通过依赖中间件来使用服务,其中,中间件是通过runtime来调用组件的服务,是真正意义上的解耦,也是该方案最核心的地方。具体实施过程是给组件封装一层target对象来对外提供服务,不会对原来组件造成入侵;然后,通过实现中间件的category来提供服务给调用者,这样使用者只需要依赖中间件,而组件则不需要依赖中间件。本方案主要依赖于CTMediator这个框架,其内部实现在下篇文章着重介绍。
(2)Protocol-Class:通过protocol定义服务接口,组件通过实现该接口来提供接口定义的服务,具体实现就是把protocol和class做一个映射,同时在内存中保存一张映射表,使用的时候,就通过protocol找到对应的class来获取需要的服务。

模块划分:

1、模块划分可根据自身业务以及需求进行划分,这里主要说下我们针对模块做的一个初步划分:


image.png
CTMediator大致步骤:

步骤总结:
第一:添加私有 Pods源
第二:创建 TestA的 Xcode 工程和对应的私有 Repo,并配置其TestA.podspec文件
第三:创建 TestA_Category 的 Xode 工程和对应的私有 Repo,并配置其TestA_Category .podspec文件。
第四:验证两个工程的.podspec文件
第五:准备发版 pod
第六:在TestA_Category 工程Classes文件夹下创建CTMediator+A,在TestA工程创建 Target(一个组件对应一个 Target-Action)
第七:CTMediator组件化

具体实现步骤:

1、创建私有的Spec Repo:
Spec Repo 是所有的Pods的一个索引,是所有公开的Pods 的podspec 文件的一个仓库,其实就是一个部署在服务器的Git仓库,他主要通过各个库的podspec文件来对各个库进行管理。

当你使用CocoaPods 后它会被Clone到本地的 ~/.cocoapods/repos 目录下,目录结构如下:

image.png

创建Spec Repo步骤:
(1)在自己的gitlab上新建一个仓库,命名:LHYSpecs
(2)执行:# pod repo add [Private Repo Name] [GitHub HTTPS clone URL]
---->例如:$ pod repo add LHYSpecs http://git.lhycom.com/lhy/LHYSpecs.git (注意把这里地址换成你自己的git仓库地址)

2、通过Xcode创建TestA工程。
(1)在gitlab上新建一个仓库,命名:TestA,然后拉取到本地。
(2)创建一个本地xcode工程,命名TestA。常见方式有两种,第一种是通过终端命令:#pod lib create [项目名],第二种是自己通过xcode创建一个工程。如果使用第二种方式,在创建之后把所有文件拷贝至步骤(1)中的本地仓库。
(3) 配置成私有 Pod
----->配置成私有 Pod 通过命令:pod spec create TestA https://git.coding.net/xxxxxxx/,成功之后会在 TestA工程中生成TestA.podspec文件。

3、通过与步骤2同样的方式创建TestA_Category,并且在Podfile中添加一行pod "CTMediator",然后执行pod install。

4、配置TestA.podspec与 TestA_Category..podspec文件
配置项根据自己需求进行配置,可以参考casa的文章,
配置项的参数意义可以参考下图:


image.png

5、检测TestA.podspec与TestA_Category..podspec是否合法,首先本地验证,然后远程验证。
(1)在Terminal中执行cd进入TDWKit.podspec文件目录
(2)本地验证执行命令:pod lib lint --verbose --allow-warnings --use-libraries
(3)远程验证执行命令:pod spec lint --verbose --allow-warnings --use-libraries

6、如果验证通过则表示两个私有库搭建成功了,如果在验证过程中出了问题则需要对问题进行解决再验证,楼主开发过程中遇到的部分问题放在文章最后。验证通过则可以分别提交TestA与TestA_Category代码到远程仓库,通过sourcetree工具或者命令行都可以。

7、提交podspec至私有Spec Repo,并且打上tag,然后命令:pod repo push [Repo名] [podspec 文件名字]


image.png

查看成果:


image.png

8、至此两个私有库完成了,接下来继续我们的CTMediator。
(1)编辑TestA.podspec,添加依赖:s.dependency "TestA_Category",并且在TestA工程中添加AViewController。写代码的地方在s.source_files = "TestA/Classes//.{h,m}"中的Classes文件夹,这个Classes文件夹是自己建的。
(2)找到TestA_Category.podspec中的s.source_files = "TestA_Category/Classes/
/.{h,m}",这里的Classes就是写代码的地方,打私有库的时候他也是打的这个文件夹里面的内容。
(3)在TestA_Category工程的Classes文件夹中新建基于CTMediator的Category:CTMediator+A
在CTMediator+A.h中添加一个方法:- (UIViewController *)A_aViewController;
在CTMediator+A.m中实现:

  • (UIViewController )A_aViewController
    {
    /

    AViewController *viewController = [[AViewController alloc] init];
    */
    return [self performTarget:@"A" action:@"viewController" params:nil shouldCacheTarget:NO];
    }
    (4)为 TestA工程创建 Target(一个组件对应一个 Target-Action):
    此时我们关掉所有XCode窗口。然后打开两个工程:TestA_Category工程和TestA工程。
    我们在TestA工程中创建一个文件夹:Target,然后看到TestA_Category里面有performTarget:@"A",所以我们新建一个对象,叫做Target_A。
    然后又看到对应的Action是viewController,于是在Target_A中新建一个方法:Action_viewController。这个Target对象是这样的:
    image.png

9、至此,就可以通过CTMediator 获取VC了。
UIViewController *viewController = [[CTMediator sharedInstance] A_aViewController];
[self.navigationController pushViewController:viewController animated:YES];

10、遇到的部分问题:
(1)在创建私有库的过程中,如果是使用“ #pod lib create [项目名] ”命令创建的xcode工程,在远程验证(远程验证命令:pod spec lint --verbose --allow-warnings --use-libraries)的时候报下图错误,如果你试了网上所有的方法还不能解决,可以自己创建xcode工程并创建且配置.podspec文件,然后直接用自己创建的.podspec文件替换原有的.podspec文件。
(2)1、当建好了私有库,在Example工程中pod install出现如图报错:target has transitive dependencies that include static binaries:
-------->解决办法:在podspec文件中添加 s.static_framework = true
(3)还有些其他问题记得不是很清楚了,有问题欢迎留言讨论。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339