什么是多重代理
多重代理即代理集,是指用一个对象拥有实现多个对象的不同功能的能力。
普通(传统)的代理的实现方式,都是一对一的,而多重代理是一对多的。
在Objective-c
中,我们经常使用delegate
去做对象之间的通信,普通的delegate
对象一般都是对象之间是一对一的关系通信。而在有些项目需求中,我们希望能够让delgate
对象拥有多种能力,比如说,在某一代理方法中,让delegate
对象同时进行 “唱歌” 和 “跳舞”。举这个例子我在这里仅仅是说明它的原理,不会在代码中体现。我们可以把它封装在一个类里面 ,降低代理的耦合性,有利于维护代码。
多重代理的原理
代理集的原理是利用runtime中的消息转发机制实现的。消息转发机制在这里仅仅简单介绍,具体请 参考苹果开发文档或者谷歌。
我们都知道,在OC中,调用一个对象的方法,其实是给这个对象发送一条消息,当这条消息(或者这个方法)在它的类中,没有找到这个方法,则继续向父类寻找,一旦找到这个方法,就去执行对应的方法实现IMP,如果,还是没有找到,就会去执行其他步骤, step:1,动态方法解析,如果你是动态的实现了这个方法,就不会去执行下面的步骤即2,否则,执行步骤2;2,消息转发,又要分两小步;具体见图片(来源网络):
实现多重代理
在这里我封装了一个类MuiltipleProxyManager
,就直接介绍如何使用这个类。
AS_SINGLETON(MuiltipleProxyManager);
是产生一个单例对象;
-(void)addDelegate:(id)object andRefreshDelegateBlock:(MuiltipleProxyManagerRefreshDelegateBlock)block;
增加一个对象到代理集中,如果这个对象,在代理集中存在,或者是[object isKindOfClass:[value class]]
为真,将会移除代理集中的对象,把这个对象添加进去。始终让代理集中存储最新的对象;
-(void)addDelegates:(id)objects andRefreshDelegateBlock:(MuiltipleProxyManagerRefreshDelegateBlock)block
;增加一组对象到代理集中,objects
可以是NSArray,NSMutableArray,NSDictionary,NSMutableDictionary
,注意,如果是 字典,键值 必须是 id key = [NSString stringWithFormat:@"%p",obj];
产生的;
-(void)removeDelegate:(id)object;
从代理集中移除一个object
;
-(void)removeDelegates:(id)objects;
从代理集中移除多个object
;
-(void)removeAllDelegates;
从代理集中全部移除对象;
默认的存储方式是MuiltipleProxyManagerDelegateTargetsTypeArray
,如果要改变存储方式,可以通过设置属性delegateTargetsType
. 注意,在向集合中添加对象时,需要更新代理,拿本例说明,
__block MuiltipleProxyManager *__weak weakProxy = proxy;
1 | [weakProxy addDelegates:dic andRefreshDelegateBlock:^{ |
小结
这个项目的工程在github上:https://github.com/woodjobber/MuiltipleProxyManager
Bugs反馈:`woodjobber@outlook.com`
微信公众号:嘀咕嘀咕(iOSSharers)
扫二维码关注