Swift 3.0实现的多代理,Multi-Delegate,含源代码Demo免费下载

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
查看查看265 回复回复2 收藏收藏 分享淘帖 转播转播 分享分享 微信
查看: 265|回复: 2
收起左侧

Swift 3.0实现的多代理,Multi-Delegate,含源代码Demo免费下载

[复制链接]
swifter 发表于 2016-10-11 09:51:21 | 显示全部楼层 |阅读模式
快来登录
获取优质的苹果资讯内容
收藏热门的iOS等技术干货
拷贝下载Swift Demo源代码
订阅梳理好了的知识点专辑




1、什么是多代理?

用过环信SDK的同学应该对多代理不陌生了,请看下面代码:

[Objective-C] 纯文本查看 复制代码
 @method
 @brief 注册一个监听对象到监听列表中
 @discussion 把监听对象添加到监听列表中准备接收相应的事件
 @param delegate 需要注册的监听对象
 @param queue 通知监听对象时的线程
 @result
 */
- (void)addDelegate:(id<EMChatManagerDelegate>)delegate delegateQueue:(dispatch_queue_t)queue;


平时我们写得比较多的代理:

[Objective-C] 纯文本查看 复制代码
@property (nonatomic,weak) id<EMChatManagerDelegate>delegate;


写了上面属性后系统会默认生成set方法:

[Objective-C] 纯文本查看 复制代码
- (void)setDelegate:(id<EMChatManagerDelegate>)delegate;


通过对两个接口的比较就不难看出:单代理只能设置一个,而多代理可以设置多个,准确来说应该是多代理可以添加多个。




2、多代理有什么用?

看到这里,敏捷大拇指上的有些Swift同行可能会问为什么要用多代理?用通知也能实现多个对象同时监听啊。是的,用监听通知的方式也能达到目的。

举个例子:服务端通过 socket 传来一个红点消息{"type":21,"content":"某某消息"},

现在多个页面都想拿到这个消息来判断自己是否需要显示红点。



2.1、用通知实现


2.1.1、监听通知

[Objective-C] 纯文本查看 复制代码
 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onReceiveMsg:) name:@"kNotificationName_OnReceiveRedPointMsg" object:nil];



2.1.2、实现通知方法

[Objective-C] 纯文本查看 复制代码
- (void)onReceiveRedPointMsg:(NSNotification *)noti {
    NSDictionary *info = noti.userInfo;
    if ([info[@"type"] integerValue] == 21) {
        <#code#>
    }
}




2.2、用代理实现


2.2.1、注册代理

[Objective-C] 纯文本查看 复制代码
[[RedPointManager sharedInstance] addDelegate:<#(id<RedPointManagerDelegate>)#>]



2.2.2、实现代理方法

[Objective-C] 纯文本查看 复制代码
- (void)redPointManagerDidReceive:(RedPointModel *)redPointModel {
    if (redPointModel.type == 21) {
        <#code#>
    }
}




显然,用代理实现更直观明了。




3、如何实现多代理?

上面提到过setDelegate: (id<EMChatManagerDelegate>)delegate的方式是不可行的,当第二次set的时候第一次设置的代理就不被持有了。只能通过addDelegate: (id<EMChatManagerDelegate>)delegate 这种方式来实现。

是不是有点不淡定了,将代理对象add到数组(或者字典)中,会使对象引用计数+1,导致代理对象不能释放。没错,直接把代理加到数组中是不可行的。但是要持有多个代理对象,又要考虑到释放问题怎么搞。看看平时写的代理属性 @property (nonatomic,weak) id<EMChatManagerDelegate>delegate; 突然想到了用weak修饰不就行了嘛。

所以,可以通过桥接来实现对多个代理对象的持有。

这样就好办了,数组持有桥接对象,桥接对象再拥有自己的delegate。

[Swift] 纯文本查看 复制代码
class WeakObjectBridge : NSObject {
    weak var weakObject : AnyObject?
    override init() {
        super.init()
    }
    init(object:AnyObject?) {
        super.init()
        weakObject = object
    }
}




3.1、操作代理

[Swift] 纯文本查看 复制代码
func operatDelegate(cb: @escaping (_ delegate:AnyObject?) -> ()){
        for weakObjectBridge in self.delegateBridges {
            DispatchQueue.main.async {
                cb(weakObjectBridge.weakObject)
            }
        }
    }




3.2、具体调用

[Swift] 纯文本查看 复制代码
func action() {
        operatDelegate { (delegate) in
            if let myDelegate = delegate as? SomeManagerDelegate {
                myDelegate.callBack()
                myDelegate.callback?(msg: ["msg":"hello world!"])
            }
        }
    }





4、Demo演示效果图

Swift 3.0实现的多代理,Multi-Delegate,含源代码Demo免费下载

Swift 3.0实现的多代理,Multi-Delegate,含源代码Demo免费下载 - 敏捷大拇指 - Swift 3.0实现的多代理,Multi-Delegate,含源代码Demo免费下载





5、Demo下载

购买下载demo,只需要敏捷大拇指上的10个金钱。金钱不够就签到领红包做任务等赚钱,别跟我哭穷,自己动手,丰衣足食。我要用金钱去竞价排名上排行榜~~


Swift 3.0实现的多代理,Multi-Delegate,含源代码Demo免费下载 Multi-Delegate-maste.zip (32.54 KB, 下载次数: 1, 售价: 10 金钱)

都看到这里了,就把这篇资料推荐给您的好朋友吧,让他们也感受一下。

回帖是一种美德,也是对楼主发帖的尊重和支持。

*声明:敏捷大拇指是全球最大的Swift开发者社区、苹果粉丝家园、智能移动门户,所载内容仅限于传递更多最新信息,并不意味赞同其观点或证实其描述;内容仅供参考,并非绝对正确的建议。本站不对上述信息的真实性、合法性、完整性做出保证;转载请注明来源并加上本站链接,敏捷大拇指将保留所有法律权益。如有疑问或建议,邮件至marketing@swifthumb.com

*联系:微信公众平台:“swifthumb” / 腾讯微博:@swifthumb / 新浪微博:@swifthumb / 官方QQ一群:343549891(满) / 官方QQ二群:245285613 ,需要报上用户名才会被同意进群,请先注册敏捷大拇指

嗯,不错!期待更多好内容,支持一把:
支持敏捷大拇指,用支付宝支付10.24元 支持敏捷大拇指,用微信支付10.24元

评分

参与人数 1金钱 +10 贡献 +10 专家分 +10 收起 理由
Anewczs + 10 + 10 + 10 32个赞!专家给力!

查看全部评分

本帖被以下淘专辑推荐:

Ding 发表于 2016-10-11 10:17:04 | 显示全部楼层
思路真不错
 楼主| swifter 发表于 2016-10-11 10:21:41 | 显示全部楼层

我也是看到不错,就转过来赚点金钱了

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

做任务,领红包。
我要发帖

分享扩散

都看到这里了,就把这资料推荐给您的好朋友吧,让他们也感受一下。
您的每一位朋友访问此永久链接后,您都将获得相应的金钱积分奖励
热门推荐

合作伙伴

Swift小苹果

  • 北京治世天下科技有限公司
  • ©2014-2016 敏捷大拇指
  • 京ICP备14029482号
  • Powered by Discuz! X3.1 Licensed
  • swifthumb Wechat Code
  •   
快速回复 返回顶部 返回列表