Mediator用过的朋友都知道它的优缺点,这篇文章我们来解决它存在的缺点
首先,我们列举一下mediator存在的缺点:
1.每新增一个模块,就要补充一个Category
2.模块A
想要调用 模块B
,模块B需要暴漏需要调用的方法
3.参数硬编码问题
4.命名规则并不美观且相对复杂,每个Target
都得加Target_A
,每个Action
都得加Action_
5.编译时候没有类型检查,运行的时候才能发现问题
这里我们提供NSObject+Mediator,解决上面的部分问题:
可以点击查看demo
demo演示一个常用场景:tableView列表,我们希望通过传参viewController、Cell、数据源data来封装一个通用功能
[NSObject performTarget:<target>.classString action:<action> object:<cell> object:<viewController>];
这个方法封装类(TableViewDemo)作为target,action方法也不需要暴漏出来,这个方法主要用来传参并返回对象
[obj performAction:<action> object:data];
刷新tableView数据源调用该方法
以上就是核心代码,完美解决1、2、4问题,但是硬编码问题似乎更严重了,这里的target和action都使用字符串,目前的解决思路是字符串映射+消息转发(resolveClassMethod)去解决参考demo
最后的类型检查是硬伤,毕竟Mediator的核心就是运行时,这样才不会产生依赖。
此外说明一下:NSObject+Mediator如何使用
NSObject+Mediator可以调用绝大数方法:
比如我们要初始化一个labelUILabel *label = [UILabel performAction:@"new"]
比如自定义的类 CustomLabel继承UILabel,UILabel *label = [NSObject performTarget:@"CustomLabel".classString action:@"new"]
其中字符串方法classString是用来区分实例方法和类方法的;
objects是参数大于2个时,使用字典参数,key从@“1”依次递增