Latest 0.0.1
Homepage https://github.com/gzhongcheng/GZCMulitiDelegate
License Copyright (c) 2019年 GZC. All rights reserved.
Platforms ios 9.0
Frameworks UIKit
Authors

常见的通信方式

首先,对OC中常见的通讯方式我们做一个对比(KVC与KVO不在讨论范围): 代理 通知 Block
适用范围 一对一 一对多 一对一
使用方式 方法调用 通知名(字符串)监听 属性、方法参数、全局变量
是否允许返回值 YES NO YES
是否具有封闭性 YES NO YES

假如我们需要一种可以一对多,同时又需要有返回值(或者出于安全性考虑不希望公开)的情况,通知就不适用了,考虑下面的情形:

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

多播代理

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

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

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

简单的多播代理使用流程

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

简单的多播代理流程

其他功能

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

使用方式

pod 'GZCMulitiDelegate'

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

调用流程

image

运行效果

image

Latest podspec

{
    "name": "GZCMulitiDelegate",
    "version": "0.0.1",
    "summary": "A Multicast delegation for Objective-C called GZCMulitiDelegate.",
    "homepage": "https://github.com/gzhongcheng/GZCMulitiDelegate",
    "license": "Copyright (c) 2019u5e74 GZC. All rights reserved.",
    "authors": {
        "gzhongcheng": "[email protected]"
    },
    "source": {
        "git": "https://github.com/gzhongcheng/GZCMulitiDelegate.git",
        "tag": "0.0.1"
    },
    "platforms": {
        "ios": "9.0"
    },
    "frameworks": "UIKit",
    "source_files": [
        "GZCMulitiDelegate",
        "GZCMulitiDelegate/**/*.{h,m}"
    ]
}

Pin It on Pinterest

Share This