CTMediator的简单使用

4,692 阅读2分钟

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
  • 成功导入 image.png

  • 创建一个CTMediator的分类 image.png

#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 image.png

image.png 这里才是真正的实现跳转的地方。

  • 调用 这样就能从这个控制器打开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];

}
  • 结构关系图如下

image.png