KVO与通知NSNotification学习笔记

KVO

KVO简介

KVO可以用于监听某个对象属性值的改变。

KVO原理

  • 当一个对象使用了KVO监听,iOS系统会修改这个对象的isa指针,
  • 改为指向一个全新的通过Runtime动态创建的子类,子类拥有自己的set方法实现,
  • set方法实现内部会顺序调用willChangeValueForKey方法、原来的setter方法实现、
  • didChangeValueForKey方法,而didChangeValueForKey方法内部
    又会调用监听器的observeValueForKeyPath:ofObject:change:context:监听方法。

KVO在swift中的运用

默认情况下,Swift类中禁用了KVO。
要想使用KVO,需要将基类设置为NSObject并在变量中添加@objc动态属性

class Person: NSObject {
    @objc dynamic var name: String
}
class PersonObserver {

    var kvoToken: NSKeyValueObservation?
    
    func observe(person: Person) {
        kvoToken = person.observe(\.name, options: .new) { (person, change) in
            guard let name = change.new else { return }
        }
    }
    deinit {
        kvoToken?.invalidate()
    }
}

NSNotification

NSNotification简介

  • 是iOS中一个调度消息通知的类,采用单例模式设计,在程序中实现传值、回调等地方应用很广。在iOS中,NSNotification 和 NSNotificaitonCenter是使用观察者模式来实现的用于跨层传递消息
  • 可以实现一对多,NSNotification 的实际是一种观察者模式。

NSNotification原理

待补充

订阅通知


NotificationCenter.default.addObserver(self, selector: #selector(disconnect), name: Notification.Name("disconnect"), object: nil)

@objc func disconnect(){
     isConnected = false
 }   

发送通知

 NotificationCenter.default.post(name: Notification.Name("disconnect"), object: nil)

移除通知

deinit {
       NotificationCenter.default.removeObserver(self)
   }
  • 在iOS9之前:不是一个类似OC中的weak类型,持有的相当与一个__unsafe_unretain指针对象,当对象释放时,会访问已经释放的对象

  • 在iOS9后不需要手动移除通知,通知中心持有的是注册者的weak指针,这时即使不对通知进行手动移除,指针也会在注册者被回收后自动置空

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值