谈谈消息传递机制

在当前的IOS开发中有着各种消息传递机制,包括

  1. KVO
  2. Notification
  3. Delegation
  4. Block
  5. target-action
  6. 已及当前最新的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