技术控

    今日:88| 主题:49270
收藏本版 (1)
最新软件应用技术尽在掌握

[其他] Swift3实现多代理

[复制链接]
汉子你别跑丫 发表于 2016-10-10 19:38:28
131 7

立即注册CoLaBug.com会员,免费获得投稿人的专业资料,享用更多功能,玩转个人品牌!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
什么是多代理

  用过环信SDK的同学应该对多代理不陌生了,请看下面代码:
  [code]@method
@brief 注册一个监听对象到监听列表中
@discussion 把监听对象添加到监听列表中准备接收相应的事件
@param delegate 需要注册的监听对象
@param queue 通知监听对象时的线程
@result
*/
- (void)addDelegate:(id

  
   
)delegate delegateQueue:(dispatch_queue_t)queue;

  [/code]     平时我们写得比较多的代理:
   @property (nonatomic,weak) id         delegate;      
   写了上面属性后系统会默认生成set方法:
   - (void)setDelegate:(id         )delegate;      
    通过对两个接口的比较就不难看出: 单代理只能设置一个,而多代理可以设置多个,准确来说应该是多代理可以添加多个
    多代理有什么用

  有些同学可能会问为什么要用多代理?用通知也能实现多个对象同时监听啊。是的,用监听通知的方式也能达到目的。
   举个例子:服务端通过 socket 传来一个红点消息 {"type":21,"content":"某某消息"} ,
  现在多个页面都想拿到这个消息来判断自己是否需要显示红点。
  用通知实现

  监听通知

  [code] [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onReceiveMsg:) name:@"kNotificationName_OnReceiveRedPointMsg" object:nil];[/code]  实现通知方法

  [code]- (void)onReceiveRedPointMsg:(NSNotification *)noti {
    NSDictionary *info = noti.userInfo;
    if ([info[@"type"] integerValue] == 21) {
        <#code#>
    }
}[/code]  用代理实现

  注册代理

  [code][[RedPointManager sharedInstance] addDelegate:<#(id

  
   
)#>]

  [/code]  实现代理方法

  [code]- (void)onReceiveRedPointMsg:(NSNotification *)noti {
    NSDictionary *info = noti.userInfo;
    if ([info[@"type"] integerValue] == 21) {
        <#code#>
    }
}[/code]  显然,用代理实现更直观明了。
  如何实现多代理

   上面提到过 setDelegate:(id         )delegate     的方式是不可行的,当第二次 set 的时候第一次设置的代理就不被持有了。只能通过 addDelegate:(id         )delegate     这种方式来实现。
   是不是有点不淡定了,将代理对象 add 到数组(或者字典)中,会使对象 引用计数+1 ,导致代理对象不能释放。没错,直接把代理加到数组中是不可行的。但是要持有多个代理对象,又要考虑到释放问题怎么搞。看看平时写的代理属性 @property (nonatomic,weak) id         delegate;     突然想到了用 weak 修饰不就行了吗。
   所以,可以通过 桥接 来实现对多个代理对象的持有。
  这样就好办了,数组持有桥接对象,桥接对象再拥有自己的delegate。
  [code]class WeakObjectBridge : NSObject {
    weak var weakObject : AnyObject?
    override init() {
        super.init()
    }
    init(object:AnyObject?) {
        super.init()
        weakObject = object
    }
}[/code]  操作代理
  [code]func operatDelegate(cb: @escaping (_ delegate:AnyObject?) -> ()){
        for weakObjectBridge in self.delegateBridges {
            DispatchQueue.main.async {
                cb(weakObjectBridge.weakObject)
            }
        }
    }[/code]  具体调用
  [code]func action() {
        operatDelegate { (delegate) in
            if let myDelegate = delegate as? SomeManagerDelegate {
                myDelegate.callBack()
                myDelegate.callback?(msg: ["msg":"hello world!"])
            }
        }
    }[/code]  Demo演示

  

Swift3实现多代理-1 (property,content,method,result,服务端)

  Demo下载

   点击这里下载 demo .
友荐云推荐




上一篇:Skype for Linux Alpha Can Now Make Video Calls — But There’s a Catch
下一篇:Microservices in Flask
酷辣虫提示酷辣虫禁止发表任何与中华人民共和国法律有抵触的内容!所有内容由用户发布,并不代表酷辣虫的观点,酷辣虫无法对用户发布内容真实性提供任何的保证,请自行验证并承担风险与后果。如您有版权、违规等问题,请通过"联系我们"或"违规举报"告知我们处理。

oo菱富爱u 发表于 2016-10-11 00:26:55
打酱油的人拉,回复下赚取积分
回复 支持 反对

使用道具 举报

playshazi 发表于 2016-10-11 01:30:00
走过路过,千万不要错过!
回复 支持 反对

使用道具 举报

以南 发表于 2016-10-11 03:16:32
汉子你别跑丫是我最崇拜的人!
回复 支持 反对

使用道具 举报

志强 发表于 2016-10-14 02:05:23
人的一生至少要有一次一见钟情,那看来我已经让很多人不枉此生了。
回复 支持 反对

使用道具 举报

socooler 发表于 2016-10-18 23:51:02
逆袭成功。。。。。。
回复 支持 反对

使用道具 举报

la啊 发表于 2016-10-24 20:30:23
一念起,万水千山;一念灭,沧海桑田。
回复 支持 反对

使用道具 举报

香柏 发表于 2016-11-16 13:00:49
路过。。。。
回复 支持 反对

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

我要投稿

推荐阅读

扫码访问 @iTTTTT瑞翔 的微博
回页顶回复上一篇下一篇回列表手机版
手机版/CoLaBug.com ( 粤ICP备05003221号 | 文网文[2010]257号 )|网站地图 酷辣虫

© 2001-2016 Comsenz Inc. Design: Dean. DiscuzFans.

返回顶部 返回列表