iOS 实现多代理的方法及实例代码

所属分类: 软件编程 / IOS 阅读数: 485
收藏 0 赞 0 分享

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下载

点击这里下载demo.

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

更多精彩内容其他人还在看

iOS开发笔记--详解UILabel的相关属性设置

这篇文章主要介绍了iOS开发笔记--详解UILabel的相关属性设置,对初学者具有一定的参考价值,有需要的可以了解一下。
收藏 0 赞 0 分享

iOS中获取系统相册中的图片实例

这篇文章主要介绍了iOS中获取系统相册中的图片实例,具有一定的参考价值没有需要的朋友可以了解一下。
收藏 0 赞 0 分享

iOS 检测网络状态的两种方法

一般有Reachability和AFNetworking监测两种方式,都是第三方的框架,下文逐一详细给大家讲解,感兴趣的朋友一起看看吧
收藏 0 赞 0 分享

IOS 性能优化中离屏渲染

本文主要介绍了IOS 性能优化中离屏渲染的资料,提供了几种方法讲解了优化,有需要的小伙伴可以参考下
收藏 0 赞 0 分享

iOS获取当前设备型号等信息(全)包含iPhone7和iPhone7P

这篇文章主要介绍了iOS获取当前设备型号设备信息的总结包含iPhone7和iPhone7P,包括ios7之前之后的获取方式,本文接的非常详细,具有参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

iOS实现爆炸的粒子效果示例代码

之前在网上看到了一个Android实现的爆炸效果,感觉非常不错,所以自己尝试用iOS来实现下效果,现在将实现的过程、原理以及遇到的问题分享给大家,有需要的朋友们可以参考借鉴,下面来一起看看吧。
收藏 0 赞 0 分享

iOS毕业设计之天气预报App

这篇文章主要为大家详细介绍了iOS毕业设计之天气预报App,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

iOS轻点、触摸和手势代码开发

这篇文章主要为大家详细介绍了iOS轻点、触摸和手势代码开发,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

iOS 实现多代理的方法及实例代码

这篇文章主要介绍了iOS 实现多代理的方法及实例代码的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

iOS文字渐变色效果的实现方法

在大家日常开发iOS的过程中,可能会遇到要实现文字渐变色的效果,这篇文章文章通过示例代码和详细的步骤介绍了如何利用iOS实现文字渐变色的效果,实现后的很不错,感兴趣的朋友们下面来一起看看吧。
收藏 0 赞 0 分享
查看更多