可以使用通知(参见第11章)实现概念上远离的两个对象间的通信,同时两个对象间又不必看到彼此。这两个对象的共同点是它们都要知道通知的名字。每个对象都能看到通知中心(它是个全局的可见对象),因此每个对象都可以发送或接收通知。
以这种方式使用通知看起来有些逃避责任,没有以显而易见的方式来架构你的对象。不过有时,一个对象不需要知道,也不应该知道发送消息的对象到底是什么。
回忆一下第11章的示例。在这个简单的纸牌游戏应用中,游戏需要知道用户什么时候轻拍了纸牌。在用户轻拍时,纸牌对游戏一无所知,只是通过发送通知发出了声音而已;游戏对象已经注册了该通知,并开始进行处理:
NSNotificationCenter.defaultCenter.postNotificationName( "cardTapped", object: self)
再来看一个示例,这个示例利用了通知就是一种广播机制的事实。在我开发的一个应用中,应用委托需要销毁界面,然后从头开始再构建出来。要想不造成内存泄漏(以及其他影响),当前运行着重复NSTimer的每个视图控制器都需要将其定时器置为无效状态(参见第12章)。相对于找出这些视图控制器,并为每个视图控制器添加一个方法进行调用,我只需发送一个通知,让应用委托发出“Everybody stop timers!”。运行定时器的所有视图控制器都注册了该通知,它们知道在接收到这个通知后应该做什么。
与之类似,KVO(参见第11章)可用于实现概念上远离的两个对象之间的同步:当一个对象的一个属性发生变化时,另外一个对象会知晓这个变化。