CTMediator 主要用于组件化之间的通讯实用,组件化后为了降低2个模块之间的耦合度一般不建议之间引用头文件来使用.
CTMediator 相当于中间层的中介对象,通过这个中介对象,让A模块调用了B模块,A的一个控制器push到B的一个控制器,但是呢,A模块中的控制器并没有引入B模块中的控制器,这样使用可以降低2个模块之间的耦合度。
简单使用这里就一个小例子讲解一下CTMediator的使用
- 创建工程
- Podfile 文件 pod install
platform :ios, '8.0'
target 'test' do
pod 'CTMediator'
end
-
成功导入
-
创建一个CTMediator的分类
#import "CTMediator.h"
#import <UIKit/UIKit.h>
@interface CTMediator (CTMediatorModuleAActions)
- (UIViewController *)CTMediator_viewControllerForDetail;
@end
#import "CTMediator+CTMediatorModuleAActions.h"
NSString * const kCTMediatorTargetA = @"Test";
NSString * const kCTMediatorActionNativeFetchDetailViewController = @"nativeFetchDetailViewController";
@implementation CTMediator (CTMediatorModuleAActions)
// CTMediator 封装?
// CTMediator : 根据不同业务 pushLogin pushDetail
//
- (UIViewController *)CTMediator_viewControllerForDetail
{
UIViewController *viewController = [self performTarget:kCTMediatorTargetA
action:kCTMediatorActionNativeFetchDetailViewController
params:@{@"key":@"value"}
shouldCacheTarget:NO
];
if ([viewController isKindOfClass:[UIViewController class]]) {
// view controller 交付出去之后,可以由外界选择是push还是present
return viewController;
} else {
// 这里处理异常场景,具体如何处理取决于产品
return [[UIViewController alloc] init];
}
}
-
这个方法我的个人理解就是封装了CTmediator的方法,意思就是我希望调用这个方法时,可以找到一个叫Target_Test的一个对象调用一个方法名为 Action_nativeFetchDetailViewController的方法,所以这里就需要创建Target_Test的类然后写上Action_nativeFetchDetailViewController的方法这个方法的实现。
-
target_test
这里才是真正的实现跳转的地方。
- 调用 这样就能从这个控制器打开TestViewController了,同时 这个控制器并没有引用test控制器的头文件。实现组件之间的通信同时低耦合。
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
UIViewController *viewController = [[CTMediator sharedInstance] CTMediator_viewControllerForDetail];
// 获得view controller之后,在这种场景下,到底push还是present,其实是要由使用者决定的,mediator只要给出view controller的实例就好了
[self presentViewController:viewController animated:YES completion:nil];
}
- 结构关系图如下