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
相关产品推荐
相关产品推荐

