0Pricing
Swift Academy · 课时

发布和观察通知

发送和接收应用范围内的事件。

发布和观察通知 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。

NotificationCenter

NotificationCenter 是一种广播机制:应用的一部分发布通知,任意数量的观察者都可以做出反应,而发送方和接收方彼此无需知晓。

默认中心

大多数代码使用 NotificationCenter.default,这是一个在进程范围内路由通知的共享中心。

import Foundation

let center = NotificationCenter.default
print("Using the default notification center")

定义通知名称

通知由 Notification.Name 标识。定义常量可以避免拼写错误,并将名称集中管理。

import Foundation

extension Notification.Name {
    static let dataUpdated = Notification.Name("dataUpdated")
}
print("Defined a notification name")

发布通知

post(name:object:)会广播通知。object通常是发送者,也可以为空值。

import Foundation

let center = NotificationCenter.default
let name = Notification.Name("ping")
center.post(name: name, object: nil)
print("Posted a notification")

添加观察者(闭包)

基于代码块的addObserver(forName:object:queue:using:)会在通知触发时运行闭包,并返回一个 token。

import Foundation

let center = NotificationCenter.default
let name = Notification.Name("ping")
let token = center.addObserver(forName: name, object: nil, queue: .main) { _ in
    print("Observer fired")
}
center.post(name: name, object: nil)
_ = token

基于选择器的观察者

经典接口使用目标对象和#selector。方法会接收一个Notification参数。

import Foundation

class Watcher: NSObject {
    func start() {
        NotificationCenter.default.addObserver(
            self, selector: #selector(handle(_:)),
            name: Notification.Name("ping"), object: nil)
    }
    @objc func handle(_ n: Notification) { print("Handled") }
}
Watcher().start()

接收通知

观察者闭包或方法会接收一个Notification值,其中包含通知的名称、对象和 userInfo。

import Foundation

let center = NotificationCenter.default
let name = Notification.Name("event")
_ = center.addObserver(forName: name, object: nil, queue: nil) { note in
    print("Got: \(note.name.rawValue)")
}
center.post(name: name, object: nil)

一对多广播

多个观察者可以监听同一个名称。一次post会通知它们全部。

import Foundation

let center = NotificationCenter.default
let name = Notification.Name("refresh")
_ = center.addObserver(forName: name, object: nil, queue: nil) { _ in print("A") }
_ = center.addObserver(forName: name, object: nil, queue: nil) { _ in print("B") }
center.post(name: name, object: nil)

按对象筛选

向addObserver传入非空的object后会进行筛选,使观察者只在来自该发送者的发布时触发。

import Foundation

let center = NotificationCenter.default
let sender = NSObject()
let name = Notification.Name("scoped")
_ = center.addObserver(forName: name, object: sender, queue: nil) { _ in
    print("Only from sender")
}
center.post(name: name, object: sender)

系统通知

系统会发布许多内置通知,例如键盘事件或应用生命周期事件,您可以用相同的方式观察它们。

import Foundation

// e.g. UIApplication.didEnterBackgroundNotification on iOS
let custom = Notification.Name("appReady")
_ = NotificationCenter.default.addObserver(forName: custom, object: nil, queue: nil) { _ in
    print("App ready")
}

何时使用

对于发送者和接收者应保持解耦的全局一对多事件,NotificationCenter 很合适。对于紧密的一对一连接,使用 delegate 通常更清晰。

import Foundation

// Broadcast a global event many parts of the app care about.
let name = Notification.Name("userLoggedOut")
NotificationCenter.default.post(name: name, object: nil)
print("Broadcast logout")

快速检查

NotificationCenter.default.post(name:object:)会做什么?

回顾

NotificationCenter.default会解耦发送者和接收者:您定义一个Notification.Name,使用post发布它,再通过闭包或选择器使用addObserver进行响应。它支持一对多广播和对象筛选。下一步:在 userInfo 中携带数据。

常见问题解答

「发布和观察通知」课时是免费的吗?

是的 — 「发布和观察通知」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。

「发布和观察通知」这节课中我会学到什么?

发送和接收应用范围内的事件。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Swift Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「发布和观察通知」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Swift Academy 课中编写并运行代码吗?

能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 发布和观察通知
  2. 通知的 userInfo 载荷
  3. 安全移除观察者
  4. 观察者模式的替代方案
← 返回 Swift Academy