CTMediator 的初体验

简介: ​ 现在对于iOS开发的要求随着时代的发展,也在渐渐地演变。这几天看到了很多JD的要求,多多少少都会提到这样的一个名字-组件化。

CTMediator 的初体验
草稿箱

接触的前提


• 现在对于iOS开发的要求随着时代的发展,也在渐渐地演变。这几天看到了很多JD的要求,多多少少都会提到这样的一个名字-组件化。

个人对于组件化的理解


• 一开始我对于组件化的理解还是很模糊的,总觉得很高端很大气很上档次的感觉。有种看得见摸不着的感觉。我的理解就是把项目中的多个小功能组件进行私有库化,让他不依赖于项目,降低项目中的耦合性。其实在一般开发中也用到过。CocoaPods我理解为也是组件化的一种形式。

CTMediator——中介者


• 个人理解为跳转的统一派送中心,有点和物流中转站差不多。统一处理页面的跳转逻辑。

CTMediator使用教程

一般原生页面的跳转


```objective-c

import "CTMediatorTestViewController.h"

import "CTMediatorPushViewController.h"

@interface CTMediatorTestViewController ()

@property (nonatomic, strong) UIButton *normalPushButton;

@end

@implementation CTMediatorTestViewController

  • (void)viewDidLoad {
    [super viewDidLoad];
    [self.view addSubview:self.normalPushButton];
    [self.normalPushButton mas_makeConstraints:^(MASConstraintMaker *make) {
      make.top.equalTo(self.view).offset(100);
      make.left.equalTo(self.view).offset(10);
    
    }];
    }

    pragma mark - 点击事件

  • (void)normalPushButtonTapAction:(UIButton *)button{
    接触的前提
    ​ 现在对于iOS开发的要求随着时代的发展,也在渐渐地演变。这几天看到了很多JD的要求,多多少少都会提到这样的一个名字-组件化。

个人对于组件化的理解
​ 一开始我对于组件化的理解还是很模糊的,总觉得很高端很大气很上档次的感觉。有种看得见摸不着的感觉。我的理解就是把项目中的多个小功能组件进行私有库化,让他不依赖于项目,降低项目中的耦合性。其实在一般开发中也用到过。CocoaPods我理解为也是组件化的一种形式。

CTMediator——中介者
​ 个人理解为跳转的统一派送中心,有点和物流中转站差不多。统一处理页面的跳转逻辑。

CTMediator使用教程
一般原生页面的跳转

import "CTMediatorTestViewController.h"

import "CTMediatorPushViewController.h"

@interface CTMediatorTestViewController ()

@property (nonatomic, strong) UIButton *normalPushButton;

@end

@implementation CTMediatorTestViewController

  • (void)viewDidLoad {
    [super viewDidLoad];
    [self.view addSubview:self.normalPushButton];
    [self.normalPushButton mas_makeConstraints:^(MASConstraintMaker *make) {
      make.top.equalTo(self.view).offset(100);
      make.left.equalTo(self.view).offset(10);
    
    }];
    }

    pragma mark - 点击事件

  • (void)normalPushButtonTapAction:(UIButton )button{
    CTMediatorPushViewController
    normalPushVC = [[CTMediatorPushViewController alloc]init];
    [self.navigationController pushViewController:normalPushVC animated:YES];
    }

    pragma mark - 懒加载

  • (UIButton *)normalPushButton{
    if (!_normalPushButton) {
      _normalPushButton = [UIButton buttonWithType:UIButtonTypeCustom];
      [_normalPushButton setTitle:@"常规Push"
                         forState:UIControlStateNormal];
      [_normalPushButton setTitleColor:[UIColor blackColor]
                              forState:UIControlStateNormal];
      [_normalPushButton addTarget:self
                            action:@selector(normalPushButtonTapAction:)
                  forControlEvents:UIControlEventTouchUpInside];
    
    }
    return _normalPushButton;
    }
    @end
    这就是很简单原生页面的跳转。当我们一个页面要去跳转不同的ViewController的时候就要在上面#import "xxxxxxx.h"。久而久之页面就会有很多的 引入文件。如果这个ViewController可以在别的项目中用到的话那是不是也要将这些引入的#import "xxxxxxx.h"也一并带入。这样就会让项目耦合性很高。

CTMediator Target-Action 实现页面跳转
我们依然使用上面的那两个控制器来实现。

1.创建 Target-Action
我们需要创建一个Target_Push类,在这个类中的.h文件中我们要添加一个函数来对目标控制器进行实例化,如果需要参数也可以进行一些赋值操作。

import

import

NS_ASSUME_NONNULL_BEGIN

@interface Target_Push : NSObject

  • (UIViewController )Action_NativeToCTMediatorPushViewController:(NSDictionary )params;

@end
然后我们在.m文件中实现我们所定义的函数

import "Target_Push.h"

import "CTMediatorPushViewController.h"

@implementation Target_Push

  • (UIViewController )Action_NativeToCTMediatorPushViewController:(NSDictionary )params{
    CTMediatorPushViewController *pushVC = [[CTMediatorPushViewController alloc]init];
    if ([params valueForKey:@""]) {

    }
    return pushVC;
    }

@end
2.创建 CTMediator 的 Category
我们在创建的分类中定义这样的一个函数

import

import "BaseViewController.h"

@interface CTMediator (PushActions)

  • (BaseViewController )dtp_mediator_ctmediatorPushViewControllerWithParams:(NSDictionary )params;

@end
这里的ViewController统一用了BaseViewController如果是用UIViewController 不要忘记了#import 。然后我们来实现这个函数

import "CTMediator+PushActions.h"

// 1. kCTMediatorTarget_Push字符串 是 Target_xxx.h 中的 xxx 部分
NSString const kCTMediatorTarget_Push = @"Push";
// 2. kCTMediatorActionNativeTo_NewsViewController 是 Target_xxx.h 中 定义的 Action_xxxx 函数名的 xxx 部分
NSString
const kCTMediatorActionNativeTo_NewsViewController = @"NativeToCTMediatorPushViewController";

@implementation CTMediator (PushActions)

  • (BaseViewController )dtp_mediator_ctmediatorPushViewControllerWithParams:(NSDictionary )params{

    BaseViewController *viewController = [self performTarget:kCTMediatorTarget_Push

                                                    action:kCTMediatorActionNativeTo_NewsViewController
                                                    params:params
                                         shouldCacheTarget:NO];
    

    if ([viewController isKindOfClass:[BaseViewController class]]) {

      GGLog(@"%@ 实例化页面成功", NSStringFromSelector(_cmd));
      return viewController;
    

    }else{

      GGLog(@"%@ 未能实例化页面", NSStringFromSelector(_cmd));
      return [[BaseViewController alloc]init];
    

    }
    }

@end
调用实现

import "CTMediatorTestViewController.h"

import "CTMediator+PushActions.h"

@interface CTMediatorTestViewController ()

@property (nonatomic, strong) UIButton *normalPushButton;

@end

@implementation CTMediatorTestViewController

  • (void)viewDidLoad {
    [super viewDidLoad];
    [self.view addSubview:self.normalPushButton];
    [self.normalPushButton mas_makeConstraints:^(MASConstraintMaker *make) {
      make.top.equalTo(self.view).offset(100);
      make.left.equalTo(self.view).offset(10);
    
    }];
    }

    pragma mark - 点击事件

  • (void)normalPushButtonTapAction:(UIButton )button{
    NSDictionary
    params = @{@"title":@"CTMediatorPushViewController"};
    BaseViewController *pushVC = [[CTMediator sharedInstance] dtp_mediator_ctmediatorPushViewControllerWithParams:params];
    [self.navigationController pushViewController:pushVC animated:YES];
    }

    pragma mark - 懒加载

  • (UIButton *)normalPushButton{
    if (!_normalPushButton) {
      _normalPushButton = [UIButton buttonWithType:UIButtonTypeCustom];
      [_normalPushButton setTitle:@"Target-Action 实现页面跳转"
                         forState:UIControlStateNormal];
      [_normalPushButton setTitleColor:[UIColor blackColor]
                              forState:UIControlStateNormal];
      [_normalPushButton addTarget:self
                            action:@selector(normalPushButtonTapAction:)
                  forControlEvents:UIControlEventTouchUpInside];
    
    }
    return _normalPushButton;
    }
    @end
    但是使用起来的过程 感觉似乎还没有之前的直接Push凡是简单。可能是我现在的理解还是不够深吧~~~
相关文章
|
存储 弹性计算 Java
我的阿里云初体验
经过同学的推荐,参加了阿里云的“飞天加速计划·高校学生在家实践 ”,首次体验了阿里云的ECS服务器,整体来说使用体验非常好,也非常推荐大家来使用ECS服务器。
200 0
我的阿里云初体验
|
Kubernetes 图形学 容器
【Agones系列】Agones初体验
本文介绍了Agones并在阿里云容器服务上运行Agones进行游戏服部署
【Agones系列】Agones初体验
|
开发者
服务器初体验
初次使用服务器的体验
|
机器学习/深度学习 弹性计算 算法
阿里云初体验
正式开启学习编程,希望能通过阿里云学到本领。从教学例程来看整体的使用过程是非常简单友好的。阿里云的控制台的使用体验是非常不错的,界面的信息都比较简单易懂。感谢阿里云提供这样的资源。
133 0
|
Java Linux Docker
阿里云的使用初体验
学生党在面对虚拟机的时候首先还是推荐使用阿里云的虚拟机,原因让我娓娓道来;
|
弹性计算 Linux 网络安全
阿里云初体验
因为对linux感兴趣,第一次使用了云服务器,有些收获
|
存储 弹性计算 Linux
阿里云初体验心得
我是一名就读于计算机科学与技术专业的在校生,学习期间在老师那了解到了“飞天加速计划”,通过简单的答题之后,我领取到了一台ECS云服务器,并计划将其作为之后自学相应网站开发的基础。
|
人工智能 Cloud Native 算法
阿里云使用初体验
阿里云作为全球领先的科技公司,在云计算与人工智能方面很有建树,为许多国家与企业提供便利的服务与强有力的技术支撑。
193 0
|
Linux 数据安全/隐私保护
使用阿里云的初体验
使用阿里云的初体验
|
域名解析 JavaScript Java