在当前的IOS开发中有着各种消息传递机制,包括
- KVO
- Notification
- Delegation
- Block
- target-action
- 已及当前最新的RAC(ReactiveCocoa)方式
那么我们该如何选择哪种情况下使用哪种机制呢,当然,有些情况下该使用什么机制没有唯一的答案,下面只谈谈自己对这些机制的理解
KVO
KVO是提供对象属性被改变时的通知的机制。KVO 的实现在 Foundation 中,很多基于 Foundation 的框架都依赖它,如果只对某个对象的值的改变感兴趣的话,就可以使用 KVO 消息传递,当然必须通过SET方法这种设置属性的方法才能响应KVO
通知
要在代码中的两个不相关的模块中传递消息时可以使用通知机制,通知可以用来发送任意消息,甚至可以包含一个 userInfo 字典数据,通知的特点在于,发送者和接收者不需要相互知道对方,单向,一对多的,可以在多个对象中注册响应者
委托 (Delegation)
使用 delegation 模式的话,发送者需要知道接收者,delegate 协议可以定义任何的方法,我们可以照着自己的需求来传递消息。可以用方法参数来传递消息内容,delegate 可以通过返回值的形式来给发送者作出回应。如果只要在相对接近的两个模块间传递消息,delgation是很灵活很直接的消息传递机制
Block
Block 是在 OS X 10.6 和 iOS 4 平台以后出现的,Block 通常可以完全替代 delegation 消息传递机制的角色。不过这两种机制都有它们自己的独特需求和优势,使用Block需要注意循环引用(retain cycles)问题
RAC(ReactiveCocoa)
现在我的项目中大部分使用的都是这种机制,有时间我将新开一遍介绍RAC
谈谈自己的理解
KVO
NSOperationQueue 用了KVO用了观察一些属性的改变如(isFinished,isExecuting,isCancelled),当这些属性改变了会收到KVO通知,所以如果只是观察某个属性值的变化那么可以用这种简单的KVO机制
通知机制
接收方可以不知道消息的发送者,消息传递是单向并且可以有多个多接收者关注着此消息,需要注意接收消息的线程就是发送消息时的线程
Delegation
当消息传递时候需要参数了我们可以使用Delegation机制
Block
Block和Delegation差不多,但Block不需要像Delegation那样必须遵循某个协议Block更灵活方便,如NSURLConnection NSURLConnection在Block之前使用的是Delegation机制进行消息传递,后来就采用了Block机制sendAsynchronousRequest:queue:completionHandler:
参考 Communication Patterns
http://www.objc.io/issue-7/communication-patterns.html