通知、block和代理的区别?

作者: heweiming 分类: iOS基础 发布时间: 2017-04-23 22:25

程序运行的过程中,数据传输是APP开发必须考虑的要点,将数据从当前执行的控制器或者控件中传回控制器或者控件,则是称为回调。比如成为tableView代理的控制器,在某个时机中,将数据传回去tableView中,让tableView更新界面等等。就是回调的一种,成为代理-执行方法这种模式,也是Cocoa Touch 中最常见的回调方式。

  除了代理之前,还有KVO,通知(KVO的一种),block。这里我们主要探讨代理、通知和block的不同。

  首先是大部分人比较熟悉的代理,代理一般需要通过6步来实现,从需要处理数据的对象——委托方,到传输数据的对象——代理方(代理一般会是控制器)。一般而言,需要6小步。如果以tableView 为例子,委托方(接收数据)tableView这个类中,需要执行三步。1.定义协议(UITableViewDelegate和UITableDataSource)。2.写需要遵循协议的属性(delegate、dataSource) 3.写协议方法。在代理方(传数据),同样需要写3步。1、遵循协议。2、成为代理。3、在适当的时机实现需要的方法。

  代理用起来的时候,需要写的代码回比较都多。

  然后再说说通知,通知比较常用的场景是,一个控制器中有了新数据,然后需要让对应的多个控件中相应界面也做出改变,也即是一对多的情况。另一方面,则是需要接收数据的控件或控制器,是隔层的情况时。通知就是最好的选择了,通知相当于广播,不知道收到通知的对象是谁,也不知道有多少个。只有在接收通知的对象本身才知道自己接收的通知来自谁,在接收通知之后作出相应改变。

  简单说说block,block来说,能实现代理相同的功能。在需要回传数据的时机,实现需要使用数据的类中已经写好的bolck,然后将相应的参数写在block中。就能完成回调。用起来相对简单,但是也许理解会有一些困难。
  
  

  • delegate 与 block 一般用于两对象一对一的通信交互。

  •   
  • notification,主要用于1对多的通信方式,通信对象之间不需要建立关系,但是通知的代码可读性差
  • 最直观的区别

    delegate更面向的是过程,并且是一对一的,一个对象只能设置一个delegate。
    block更面向的是结果,与delegate一样,一般都是“一对一”之间的通信,但是更加简练
    notifocation更面向的是一对多,如果app中有很多个控制器需要知道一个事件,那就应该用代理

    如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

    发表评论

    电子邮件地址不会被公开。 必填项已用*标注