美文网首页
Delegate和Notification的区别

Delegate和Notification的区别

作者: 时间在改变 | 来源:发表于2017-08-19 21:45 被阅读0次

    我们通常去应聘的时候笔试题可能会带上这么一条,那么我们的回答是什么呢?我记得我以前的笔试写的很简洁,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)

    响应式编程:不需要考虑调用顺序,只需要知道考虑结果,类似于蝴蝶效应,产生一个事件,会影响很多东西,这些事件像流一样的传播出去,然后影响结果。

    相关文章

      网友评论

          本文标题:Delegate和Notification的区别

          本文链接:https://www.haomeiwen.com/subject/izztdxtx.html