美文网首页iOS学术研讨专题程序员ios开发
iOS 组件之间的通讯(Target-Action)

iOS 组件之间的通讯(Target-Action)

作者: kvoxxx | 来源:发表于2018-04-02 22:51 被阅读972次

什么是组件间通讯?

  • 比如现在有很多业务组件, 在另外一个组件内部需要调用另外一个组件中的服务, 或者打开另外一个组件中的控制器, 并传值

iOS业界讨论组件化方案甚多,大体来说有3种。

  • Protocol注册方案
  • URL注册方案
  • Target-Action runtime调用方案

MGJRoute方案

URL注册方案 蘑菇街 App 的组件化之路 已经说的很清楚了 可以去看下

原理:

  • 通过url注册服务, 其他地方通过url, 获取服务
  • 框架在维护一个url-block的表格

特点:

  • 每个业务组件, 都需要依赖这个框架
  • url维护成本高 硬解码
  • 可以在组件内部任何地方调用/注册服务, 没有必要统一组件接口服务

target-action方案

原理:

  • 每个组件, 提供一个统一披露的接口文件
  • 额外的维护一个中间件的分类扩展(在此处进行硬解码 通过运行时进行物理解耦)
  • 其他地方通过target-action;的方案进行交互

特点:

  • 集约
  • 统一了组件api服务
  • 组件与框架之间无依赖关系
  • 需要额外维护中间件类扩展

Protocol方案 暂无了解

本文 主要讲解 target-action 方案

侵入性问题
正如你所见,CTMediator组件化方案的实施非常安全。因为它并不存在任何侵入性的代码修改。
对于响应者来说,什么代码都不用改,只需要包一层Target-Action即可。
对于调用者来说,只需要把调用方式换成CTMediator调用即可,其改动也不涉及原有的业务逻辑,所以是十分安全的。

注册问题
CTMediator没有任何注册逻辑的代码,避免了注册文件的维护和管理。Category给到的方法很明确地告知了调用者应该如何调用。

例如给到的

- (UIViewController *)goodsDetailViewControllerWithGoodsId:(NSString *)goodsId goodsName:(NSString *)goodsName;

方法。这能够让工程师一眼就能够明白使用方式,而不必抓瞎拿着URL再去翻文档。
这可以很大程度提高工作效率,同时降低维护成本。

下面是我做的项目Dome结构 Snip20180403_5.png

我们主要是依赖CTMediator 这个中间件

工具类中主要使用如下方法

- (id)performTarget:(NSString *)targetName action:(NSString *)actionName params:(NSDictionary *)params shouldCacheTarget:(BOOL)shouldCacheTarget

方法内部使用Runtime调用 需要传三个参数

  • 当前需要调用的类名 (字符串)
  • 当前需要调用类的方法名 (字符串)
  • 需要传的参数 (字典形式)
# 通过Runtime  把字符串 转换类
Class targetClass = NSClassFromString(ClassString);
id  target = [[targetClass alloc] init];

# 把字符串转换成事件
SEL action = NSSelectorFromString(actionString);

# 如果当前类中有这个事件 那就执行这个事件 把需要的参数传值 
if ([target respondsToSelector:action]) {
    return [target performSelector:action withObject:params];
} 

下面是一个组件的结构


Snip20180403_6.png

我们当前 TAConfirmOrder 组件中

  • TAConfirmOrderViewController 是业务组件
  • Target_TAConfirmOrder 是每个组件, 提供一个统一披露的接口文件
  • CTMediator+TAConfirmOrder 是额外的维护一个中间件的分类扩展
  • 组件与框架之间无依赖关系,我们需要额外维护中间件类扩展就可以了

我们只需要把类名和类中的方法名 告诉这个分类扩展就行了


Snip20180403_7.png

最后 Dome 地址

相关文章

  • iOS 组件化2

    组件化2 本文主要讲组件化之间是如何通讯的 组件化通讯方案 1、URL路由 2、target-action 3、p...

  • iOS 组件之间的通讯(Target-Action)

    什么是组件间通讯? 比如现在有很多业务组件, 在另外一个组件内部需要调用另外一个组件中的服务, 或者打开另外一个组...

  • iOS 模块化 [基于oc]

    CTMediator: 优点:协定了Target-Action 方式,避免来了业务代码之间污染,组件之间解耦,易于...

  • iOS中CTMediator原理探究

    一、前言 相信各位iOS开发者在做组件化开发中都有考虑过组件之间的通讯问题。由于市面上有主流开源的组件化通讯有蘑菇...

  • vue页面和component组件之间双向通讯(续1)

    VUE中父组件、子组件之间的双向通讯可以参见笔者的《vue页面和component组件之间双向通讯[https:/...

  • Vue兄弟组件通信(VueX)

    在vue里,组件之间的作用域是独立的,父组件跟子组件之间的通讯可以通过prop属性来传参,但是在兄弟组件之间通讯就...

  • 组件之间的通讯

    父子关系通讯: 1、父组件向子组件传入数据 – @Input 可以看到,我们使用装饰器@Input修饰了count...

  • 组件之间的通讯

    在开发项目的时候 我们基本上是按照模块组件来划分的 也就是一个个模块单独开发然后再合并 最后打包成为一个独立的作品...

  • 关于组件化的讨论相关的阅读

    一、关于使用路由url的方式或者Target-Action的方式的比较: 1、《iOS应用架构谈 组件化方案》 2...

  • 7天深入Vue - vue组件之间的通讯与插槽(一)

    常用组件之间的通讯 1.props vue 基础父子组件通讯 数组形式 子组件定义props:['title', ...

网友评论

    本文标题:iOS 组件之间的通讯(Target-Action)

    本文链接:https://www.haomeiwen.com/subject/ehyxhftx.html