GZCMulitiDelegate 0.0.1

GZCMulitiDelegate 0.0.1

gzhongcheng 维护。



  • By
  • gzhongcheng

GZCMulitiDelegate

常见的通信方式

首先,对OC中常见的通讯方式我们做一个对比(KVC与KVO不在讨论范围): ||代理 | 通知 |Block| |---| --- | --- | --- | |适用范围 | 一对一 |一对多 | 一对一 | |使用方式 | 方法调用 |通知名(字符串)监听 | 属性、方法参数、全局变量 | |是否允许返回值|YES|NO|YES| |是否具有封闭性 |YES |NO |YES | 假如我们需要一种可以一对多,同时又需要有返回值(或者出于安全性考虑不希望公开)的情况,通知就不适用了,考虑下面的情形:

  • 使用一个单例控制蓝牙连接断开等状态,但是有好几个类都需要监听蓝牙的状态?
  • 希望App能够一键切换主题?
  • 异步加载多种资源,想获取总的加载进度?

多播代理

C#中有一种委托形式称作多播委托,会顺序执行多个委托对象的对应函数。 OC中系统并没有提供类似的类型让我们使用,所以需要自己实现类似的功能。

多播代理相对于通知的优势

多播代理 通知
接收范围 定点投放,只有已添加的代理可以接收到消息 全局都可接收,会暴露实现细节,广播出的参数中可能包含敏感信息
使用方式 方法调用,使用协议来约束代理者的方法实现 通知名(字符串)监听,容易出现问题,当项目中大量使用通知以后难以维护,极端情况会出现通知名重复的问题
是否允许返回值 YES NO
是否具有封闭性 YES NO

简单的多播代理使用流程

这里有一个简单的使用流程图:

简单的多播代理流程

其他功能

本工具除了支持简单的消息分发,还支持从代理方法中获取返回值,所有的返回值将会被存储在一个NSArray中,如果需要区分各个返回值对应的对象,可以使用字典作为返回值。

使用方式

使用方式可以参考Demo中的代码(比较简单,就不赘述了)

调用流程

image

运行效果

image