我们通常去应聘的时候笔试题可能会带上这么一条,那么我们的回答是什么呢?我记得我以前的笔试写的很简洁,Delegate一对一,Notification一对多。
什么是一对一、一对多?
Delegate:声明一个协议,将事情委托给别人来做;
例如我们常用的tableView,通常我们将delegate设成Controller,tableView将它的事情交给了Controller来做,这就是一对一的通信。
Notification:我们常称之为观察者、广播,这样我们能理解,对于某个指令多个对象都来观察,当这个指令发出时,观察这个指令的对象发生相应的改变;同时类似广播的特性,不会去管接受者是谁,并在发送后,不接受反馈。
由于Notification的指令可能发给多个不同的对象,这就是一对多通信。
注:Delegate不用第三方监听事件和传输数据,但Notification需要,它有一个单例的通知中心。使用时,Notification的管理可以避过编译,但仍然需要有注册就有注销,有add就有remove,避免crash。
Delegate和Notification的区别是否就是一对一和一对多的区别?
现在我们知道有MultiDelegate,在开源库XMPPFramework中提供了一个GCDMulticastDelegate类,使用它可以为一个对象添加多个被委托的对象,那么Delegate也是可以一对多的。
Delegate和Notification的本质区别是什么?
在使用Delegate时,你会告诉委托对象去做什么,等他做完之后你再告诉他接着做什么,这是一种命令式的,你需要面对委托者,知道他是谁;
例如UITextFieldDelegate
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField;
- (void)textFieldDidBeginEditing:(UITextField *)textField;
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField;
- (void)textFieldDidEndEditing:(UITextField *)textField;
在使用Notification时,你只需要告诉他你要什么,他就给做成了,这是一种响应式的,而且你不需要知道他是谁。
因此Delegate和Notification的本质区别是命令式和响应式。
命令式编程:命令“机器”如何去做事情(how),这样不管你想要的是什么(what),它都会按照你的命令实现,需要一步步写清楚程序需要如何做什么(How to do What)
响应式编程:不需要考虑调用顺序,只需要知道考虑结果,类似于蝴蝶效应,产生一个事件,会影响很多东西,这些事件像流一样的传播出去,然后影响结果。