You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中NotificationCenter问题:添加观察者无效及参数获取

问题解答

一、为什么收不到通知?

检查以下几个关键问题:

  • 注册时机滞后于通知发送:如果addObserver是在post通知之后才执行的,观察者自然收不到已经发送的通知。比如你先触发了通知发送,之后才完成观察者注册,这种情况肯定收不到。
  • 观察者对象已被销毁:如果调用addObserver的self在通知发送时已经被释放(比如ViewController被弹出、对象已执行deinit),那么观察者已经不存在,无法接收通知。可以在对象的deinit方法中添加打印语句,确认对象是否还存活。
  • 避免手动拼写通知名称出错:你当前分别用Notification.Name(rawValue: "JSON")和NSNotification.Name("JSON")定义通知名称,虽然逻辑上一致,但手动拼写容易出错。建议把通知名称定义成常量,统一调用:
    extension Notification.Name {
        static let jsonNotification = Notification.Name(rawValue: "JSON")
    }
    
    后续发送和注册都使用.jsonNotification,彻底避免拼写问题。

二、如何获取user@domain.com的值?

你当前把数据放在了post方法的object参数里,接收时需要做类型转换后取值:

@objc
func receiveJsNotification(_ notification: Notification) {
    print("received notification")
    // 先判断类型再安全取值
    if let userData = notification.object as? [String: String],
       let email = userData["json"] {
        print("获取到的邮箱:\(email)")
    }
}

更规范的做法是把额外数据放在userInfo参数中(object通常用来传递发送通知的源对象),代码如下:

// 发送通知时改用userInfo
NotificationCenter.default.post(
    name: .jsonNotification,
    object: self, // 传递当前发送对象,方便后续过滤通知
    userInfo: ["json": "user@domain.com"]
)

// 接收时从userInfo中取值
@objc
func receiveJsNotification(_ notification: Notification) {
    print("received notification")
    if let email = notification.userInfo?["json"] as? String {
        print("获取到的邮箱:\(email)")
    }
}

内容的提问来源于stack exchange,提问作者Darren Gates

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 17:12:14