Delegate 是协议的一种,顾名思义,就是委托他人帮自己去做什么事。也就是当自己做什么事情不方便的时候,就可以建立一个委托,这样就可以委托他人帮自己去实现什么方法。
我简单的总结了一下自己用到的委托的作用有两个,一个是传值,一个是传事件。
1.所谓传值经常用在b类要把自己的一个数据或者对象传给a类,让a类去展示或者处理。(切分紧耦合,和代码分块的时候经常用)
2.所谓传事件就是a类发生了什么事,把这件事告诉关注自己的人,也就是委托的对象,由委托的对象去考虑发生这个事件后应该做出什么反映。(这个经常见,例如在异步请求中,界面事件触发数据层改变等等)
3.利用委托赋值,这种方法感觉是为了不暴露自己的属性就可以给自己复值,而且这样更方便了类的管理,只有在你想要让别人给你赋值的时候才调用,这样的赋值更可控一些。(例如tableView中的委托(dateSource)中常见)。
Example:
NSNotification: 这是一个观察者模式, 一方添加观察者,一方发出通知。
首先在你需要监听的类中加入观察者:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:(SEL)aSelector
name:aName object:(id)anObject];
这个观察者在监听到anObject发送名字为aName的notification时,调用selector的方法,在aSelector方法中得到userInfo。
anObject表示从谁那儿发送出来的消息。
一般的selector中的方法可以这么写:
- (void)method: (NSNotification:)sender { NSDictionary *dict = [sender userInfo]; }
也就是说监听到了anObject发出消息,消息的名字是aName,此时observer就调用aSelector方法,把notification的userInfo拷贝到本地。
发送通知:
[[NSNotificationCenter defaultCenter] postNotificationName:aName object:self];
通知中心将会区分它们对象对这些通知感兴趣并且通知他们。如果除了关心观察者的通知名称和观察的对象,还关心其他之外的对象,那么就把之外的对象放在通知的可选字典中,或者用方法
postNotificationName:object:userInfo:
移除通知:removeObserver:和removeObserver:name:object:
[[NSNotificationCenter defaultCenter] removeObserver:observer name:nil object:self];
总结:IOS中消息传递机制有很多,针对不同的机制,我们应该怎样选择?以下纯属个人看法:
1. 当一个界面需要回调子界面的方法,并且与其他任何界面没有关联,可以考虑使用block。
2. 当很多界面都使用到相同的实现方法,可以考虑使用代理。
3. 两个界面看起来没有任何关联,但有一方需要随时监听外来的消息,可以考虑使用通知。