GZCMulitiDelegate
常见的通信方式
首先,对OC中常见的通讯方式我们做一个对比(KVC与KVO不在讨论范围): ||代理 | 通知 |Block| |---| --- | --- | --- | |适用范围 | 一对一 |一对多 | 一对一 | |使用方式 | 方法调用 |通知名(字符串)监听 | 属性、方法参数、全局变量 | |是否允许返回值|YES|NO|YES| |是否具有封闭性 |YES |NO |YES | 假如我们需要一种可以一对多,同时又需要有返回值(或者出于安全性考虑不希望公开)的情况,通知就不适用了,考虑下面的情形:
- 使用一个单例控制蓝牙连接断开等状态,但是有好几个类都需要监听蓝牙的状态?
- 希望App能够一键切换主题?
- 异步加载多种资源,想获取总的加载进度?
多播代理
C#中有一种委托形式称作多播委托,会顺序执行多个委托对象的对应函数。 OC中系统并没有提供类似的类型让我们使用,所以需要自己实现类似的功能。
多播代理相对于通知的优势
多播代理 | 通知 | |
---|---|---|
接收范围 | 定点投放,只有已添加的代理可以接收到消息 | 全局都可接收,会暴露实现细节,广播出的参数中可能包含敏感信息 |
使用方式 | 方法调用,使用协议来约束代理者的方法实现 | 通知名(字符串)监听,容易出现问题,当项目中大量使用通知以后难以维护,极端情况会出现通知名重复的问题 |
是否允许返回值 | YES | NO |
是否具有封闭性 | YES | NO |
简单的多播代理使用流程
这里有一个简单的使用流程图:
其他功能
本工具除了支持简单的消息分发,还支持从代理方法中获取返回值,所有的返回值将会被存储在一个NSArray中,如果需要区分各个返回值对应的对象,可以使用字典作为返回值。
使用方式
使用方式可以参考Demo中的代码(比较简单,就不赘述了)