iOS学术研讨专题程序员ios开发

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

2018-04-02  本文已影响972人  kvoxxx

什么是组件间通讯?

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

MGJRoute方案

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

原理:

特点:

target-action方案

原理:

特点:

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 组件中

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


Snip20180403_7.png

最后 Dome 地址

上一篇下一篇

猜你喜欢

热点阅读