概述
上篇文章cocopods创建私有库,主要讲解通过cocopods创建私有库。这篇文章主要讲解通过cocopods实现本地组件化,以及CTMediator的如何实现和实现原理
demo
下面创建了一个本地化的组件化的 demo,该demo没有实现具体的功能,知识创建了几个组件,仅供参考
CTMediator用法
比如上面的demo
中有QHHomeModule
和QHUserModule
两个组件。现在需要这两个组件之间可以相互的使用,为了不出现耦合,我们可以使用CTMediator
这个中间者来解耦。
没有解耦之前:
使用CTMediator解耦之后:
创建Target-Action
比如我们希望首页模块的功能被其他模块使用,需要创建一个Target_QHHomeModule
,并且必须以Target_
开头。
创建访问首页的实例方法必须以Action_
开头
- (UIViewController *)Action_nativeHomeViewController:(NSDictionary * _Nonnull** )params{
QHHomeViewController *vc = [[QHHomeViewController alloc] init];
return* vc;
}
创建CTMediator Category
创建CTMediator+QHHomeModuleAction.h
,添加分类方法
NSString * const kCTMediatorTargetHomeModule = @"QHHomeModule";
NSString * const kCTMediatorActionNativeHomeViewController = @"nativeHomeViewController";
- (UIViewController *)CTMediator_naviagetHomeVC:(NSDictionary *)parames{
UIViewController *viewController = [self performTarget:kCTMediatorTargetHomeModule
action:kCTMediatorActionNativeHomeViewController
params:parames
shouldCacheTarget:NO ];
return viewController;
}
其中kCTMediatorTargetHomeModule
定义的名字必须和上面Target_
后面的名字匹配,kCTMediatorActionNativeHomeViewController
定义的名字必须和Action_
后面的名字匹配
CTMediator使用
如果需要使用首页模块只需要引入CTMediator+QHHomeModuleAction.h
即可,然后调用下面的方法即可
UIViewController *vc = [[CTMediator sharedInstance] CTMediator_naviagetHomeVC:@{}];
CTMediator源码分析
我们看CTMediator主要提供了4个接口
- 单例获取
performActionWithUrl
:远程App调用入口performTarget
:本地组件调用releaseCachedTargetWithTargetName
:释放 通过看源码我们发现其实performActionWithUrl
,最终还是调用performTarget
,所以我们主要分析一下performTarget
方法即可
performTarget方法
- 通过缓存获取Taget,如果换成没有,直接创建
- 获取到对应的
Taget
和action
,如果有对应的实现调用safePerformAction
safePerformAction
方法其实很简单,如果method
的返回类型是id类型,这直接调用performSelector
实现消息的发送,如果method
的返回类型是void
,NSInteger
、BOOL
类型通过NSInvocation
来实现转发。
总结,CTMediator方法实际上就是通过OC
语言的动态特性,通过字符串动态的获取到对应的类对象
,让后通过消息的转发msg_send
,动态的来实现方法的调用。