iOS - 通知 代理 KVO Block

文章目录

NSNotification 通知

基本流程:controller使用name发送通知,持有与之相同name的另一方接收通知并进行处理(如果添加的观察者name为空,那么就会接收所有通知)。

NSNotification是iOS中一个调度消息通知的类,属于观察者模式的一种,在程序中实现传值、回调等地方引用很广。在iOS中,NSNotification是使用观察者模式来实现的用于跨层传递消息。往往也用NSNotification来实现解耦的目的
NSNotification是通知,也是一对多的使用场景

delegate代理

基本流程:一个controller定义了一个协议,协议里有若干个方法,一个对象如果想作为controller的delegate,就必须得实现这些方法,也就是controller委托另一个对象作为controller的代理去实现协议里面的方法,controller会在合适的时间调用该方法

delegate是代理,就是我不想做的事情交给别人做。调用delegate,由其他类完成所需要的操作。所以delegate是一对一关系。delegate一般的使用场景是行为,需求是需要别人帮我做一件事,我们一般用delegate。

block

基本流程:block是对象,它封装了一段代码,这段代码可以在任何时候执行。block可以作为函数参数或者函数的返回值,其本身也可以带输入参数或返回值。

block是delegate的另一种形式,是函数式编程的一种形式。使用场景跟delegate一样,相比delegate更灵活,而且代理的实现更直观

KVO

基本流程:一个对象监听另一个任意类型对象,当该对象的值改变,观察对象马上作出反应

KVO就是cocoa框架实现的观察者模式,一般同KVC搭配使用,通过KVO可以监测一个值的变化,比如View的高度变化。是一对多的关系,一个值的变化会通知所有的观察者

对比

KVO和NSNotification的对比

相同:都是一对多的关系
不同:通知是需要被观察者先主动发出通知,观察者注册在监听在相应,比KVO多了发送通知这一步
监听范围:KVO是监听一个值的变化,通知不局限于监听属性的变化,还可以对多种多样的状态变化进行监听,监听范围广,使用更灵活
使用场景:KVO的一般使用场景是监听数据变化,通知是全局通知

delegate和NSNotification对比

效率:代理比通知高
关联:delegate是强关联,委托和代理双方互相知道,通知是弱关联,不需要知道是谁发的,也不需要知道是谁接收
代理是一对一的关系,通知是一对多的关系。delegate一般是行为需要别人来完成。通知是全局通知
代理要实现对多个类发出消息可以通过将代理者添加入集合类后遍历,或通过消息转发来实现

block和delegate对比

相同点:block和代理都是回调的方式,使用场景相同
不同点:block集中代码块,而代理分散代码块。所以block更适用于轻便,简单的回调,如网络传输。代理适用于公共接口较多的情况。这样做也更易于解耦代码架构
block运行成本高。block出栈时,需要将使用的数据从栈内存拷贝到堆内存。当然如果是对象就是加计数,使用完成block置为nil后才消除。代理只是保存了一个对象指针,直接回调,并没有额外消耗。相对C的函数指针,只是多做了一个查表动作

iOS - 通知 代理 KVO Block

涉及到的一些设计模式

观察者模式

通过添加观察者来观察某个对象的实例变量的变化,当被观察者的对象发生时,发出通知,通知观察者
实例:

  • NSNotificationCenter和NSNotificationiOS中的通知机制是非常典型的观察者模式,所有的类可以通过NSNotificationCenter 监听和发送 NSNotification,观察者和被观察者都无需知晓对方,只需要通过标记(例如 NotificationName)在 NSNotificationCenter 中找到监听该通知所对应的类,从而调出该类的方法
  • KVO可以监听某个对象属性值的改变,当被监听者的被监听内容发生变化时,会调用监听者的observeValueForKeyPath

代理模式

代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。代理模式使项目的逻辑结构比较直观,比如tableView的delegate和DataSource。允许一个类在某些特定时刻通知到其他类,而不需要获取到那些类的指针,可以减少框架复杂度和耦合度。
优势:解耦合 ,敏捷原则

iOS - 通知 代理 KVO Block

常见的两种
iOS - 通知 代理 KVO Block

几种传值的详细举例

协议传值
多界面传值的五种方法

上一篇:动态代理模式


下一篇:iOS基于AVFoundation实现朗读文字