惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LangChain Blog
博客园_首页
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
月光博客
月光博客
S
SegmentFault 最新的问题
量子位
Apple Machine Learning Research
Apple Machine Learning Research
博客园 - 司徒正美
博客园 - Franky
Google DeepMind News
Google DeepMind News
Recent Announcements
Recent Announcements
B
Blog RSS Feed
C
Check Point Blog
The Cloudflare Blog
M
MIT News - Artificial intelligence
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
F
Fortinet All Blogs
Hugging Face - Blog
Hugging Face - Blog
博客园 - 叶小钗
V
Visual Studio Blog
V
V2EX
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - 聂微东
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

木土金王可

复盘 2024,年度好物分享 落地 第二十台相机:宝丽来(Polaroid)Impulse AF 第十九台相机:哈苏(Hasselblad)X1D II 第十八台相机:宝丽来(Polaroid)Macro 5 SLR 第十七台相机:康泰时(Contax)S2 稻荷山 Dave Chappelle: The Closer 语言是思想的边界 对街头卖惨表演的看法 《民主森林》 电梯英雄 2023,年度好物分享 《大画幅 4x5》复活 新加坡华侨银行(OCBC)开户指南 第十六台相机:宾得(Pentax)PC35AF-M SEDATE 第十五台相机:沙慕尼(Chamonix)4x5 F2 Xbox 连接 Studio Display Twitter、Apple、Meta 和 Reddit 广告平台使用体验 第十四台相机:康泰时(Contax)S2 你到底什么时候买相机 拍摄胶片的理由 HomePod 不能作为 Mac 音响 男性生来就是残缺的女性 第十三台相机:柯尼卡(Konica)Big Mini 301 三年,十二台相机 恐怖片很好看啊 比残忍更残忍 用 SwiftUI 重构「行动日」
在 iOS 开发中使用键值对监听(KVO)与通知(Notification)
kinnouka bokudo · 2018-09-06 · via 木土金王可

声明:笔者自身对 KVO 与 Notification 也是初学,而本文介绍的 KVO 与 Notification 知识也都是自己的一些理解,同时尽量不涉及过于原理性的内容,一切以普通工程师实用为目标原则。其中可以想象在很多地方会有理解的错误,还请多包涵。如您发现问题,也往不吝赐教指正,感激不尽。

注册

KVO

被监听的对象,必须继承 NSObject,被监听的变量,必须加上 @objc dynamic 修饰符。

class Person: NSObject {
    @objc dynamic var age = 0

    override init() {
        super.init()
    }
}

KVO 注册监听的方式有三种:

let person = Person()

// 纯注册监听
person.addObserver(self, forKeyPath: "age", options: [.new, .old], context: nil)

// 注册监听,并且设置触发动作
person.observe(\Person.age) { (person, change) in
    print(change.newValue)
    print(change.oldValue)
}

// 注册监听,并且设置触发动作
person.observe(\.age, options: [.new, .old]) { (person, change) in
    print(change.newValue)
    print(change.oldValue)
}

Notification

let ageKey = Notification.Name("AgeKey")

NotificationCenter.default.addObserver(self, selector: #selector(notificationObserveFunc), name: ageKey, object: nil)

@objc func notificationObserveFunc() {
    print("Notification Observe")
}

触发

KVO

通过重写 observeValue(forKeyPath:of:change:context:),当被监听的值发生改变的时候即可触发事件。

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    print("New: \(change![NSKeyValueChangeKey.newKey])")
    print("Old: \(change![NSKeyValueChangeKey.oldKey])")
}

Notification

NotificationCenter.default.post(name: ageKey, object: nil)

注销

KVO

deinit {
    person.removeObserver(self, forKeyPath: "age")
}

Notification

deinit {
    NotificationCenter.default.removeObserver(self)
}

2018 年 9 月 6 日