iOS 实现多代理的方法及实例代码
2019/7/9 23:09:54
本文主要是介绍iOS 实现多代理的方法及实例代码,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
iOS实现多代理
什么是多代理
用过环信SDK的同学应该对多代理不陌生了,请看下面代码:
@method @brief 注册一个监听对象到监听列表中 @discussion 把监听对象添加到监听列表中准备接收相应的事件 @param delegate 需要注册的监听对象 @param queue 通知监听对象时的线程 @result */ - (void)addDelegate:(id<EMChatManagerDelegate>)delegate delegateQueue:(dispatch_queue_t)queue;
平时我们写得比较多的代理:
@property (nonatomic,weak) id<EMChatManagerDelegate>delegate;
写了上面属性后系统会默认生成set方法:
- (void)setDelegate:(id<EMChatManagerDelegate>)delegate;
通过对两个接口的比较就不难看出:单代理只能设置一个,而多代理可以设置多个,准确来说应该是多代理可以添加多个
多代理有什么用
有些同学可能会问为什么要用多代理?用通知也能实现多个对象同时监听啊。是的,用监听通知的方式也能达到目的。
举个例子:服务端通过 socket 传来一个红点消息{"type":21,"content":"某某消息"},
现在多个页面都想拿到这个消息来判断自己是否需要显示红点。
用通知实现
监听通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onReceiveMsg:) name:@"kNotificationName_OnReceiveRedPointMsg" object:nil];
实现通知方法
- (void)onReceiveRedPointMsg:(NSNotification *)noti { NSDictionary *info = noti.userInfo; if ([info[@"type"] integerValue] == 21) { <#code#> } }
用代理实现
注册代理
[[RedPointManager sharedInstance] addDelegate:<#(id<RedPointManagerDelegate>)#>]
实现代理方法
- (void)redPointManagerDidReceive:(RedPointModel *)redPointModel { if (redPointModel.type == 21) { <#code#> } }
显然,用代理实现更直观明了。
如何实现多代理
上面提到过setDelegate:(id<EMChatManagerDelegate>)delegate的方式是不可行的,当第二次set的时候第一次设置的代理就不被持有了。只能通过addDelegate:(id<EMChatManagerDelegate>)delegate 这种方式来实现。
是不是有点不淡定了,将代理对象add到数组(或者字典)中,会使对象引用计数+1,导致代理对象不能释放。没错,直接把代理加到数组中是不可行的。但是要持有多个代理对象,又要考虑到释放问题怎么搞。看看平时写的代理属性 @property (nonatomic,weak) id<EMChatManagerDelegate>delegate; 突然想到了用weak修饰不就行了吗。
所以,可以通过桥接来实现对多个代理对象的持有。
这样就好办了,数组持有桥接对象,桥接对象再拥有自己的delegate。
class WeakObjectBridge : NSObject { weak var weakObject : AnyObject? override init() { super.init() } init(object:AnyObject?) { super.init() weakObject = object } }
操作代理
func operatDelegate(cb: @escaping (_ delegate:AnyObject?) -> ()){ for weakObjectBridge in self.delegateBridges { DispatchQueue.main.async { cb(weakObjectBridge.weakObject) } } }
具体调用
func action() { operatDelegate { (delegate) in if let myDelegate = delegate as? SomeManagerDelegate { myDelegate.callBack() myDelegate.callback?(msg: ["msg":"hello world!"]) } } }
Demo演示
Demo下载
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
这篇关于iOS 实现多代理的方法及实例代码的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-12Axios库资料:新手入门必读教程
- 2024-11-11Axios库项目实战:新手入门教程
- 2024-09-29Axios库教程:初学者必备指南
- 2024-08-29Axios库资料:新手入门指南与基本使用教程
- 2024-03-14system bios shadowed
- 2024-03-14gabios
- 2024-02-07iOS应用提交上架的最新流程
- 2024-02-06打包 iOS 的 IPA 文件
- 2023-12-07uniapp打包iOS应用并通过审核:代码混淆的终极解决方案 ?
- 2023-11-25uniapp IOS从打包到上架流程(详细简单) 原创