介绍
- UIKit 带来了强类型通知,为通知系统带来了期待已久的类型与并发安全性。
- 不再使用基于字符串的标识符以及通过
userInfo
字典传递数据,该种方式存在线程安全、拼写错误、类型转换等问题。
- 通过全新的并发安全通知协议
NotificationCenter.MainActorMessage
(主线程消息)与NotificationCenter.AsyncMessage
(异步消息)可以做到编译时检测,从而提前发现潜在的问题。
- 与老版本的通知系统完全兼容。
使用
import UIKit
public class NotificationSubject {
static let shared = NotificationSubject()
}
public struct CustomMainActorMessage: NotificationCenter.MainActorMessage {
public typealias Subject = NotificationSubject
public static var name: Notification.Name {
.init("CustomMainActorMessage")
}
let info: String
}
class ViewController: UIViewController {
lazy var label: UILabel = {
let label = UILabel()
label.frame = CGRect(x: 0, y: 0, width: 300, height: 60)
label.textAlignment = .center
label.text = "暂无通知消息"
label.center = view.center
return label
}()
var mainActorMessageToken: NotificationCenter.ObservationToken!
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(label)
mainActorMessageToken = NotificationCenter.default.addObserver(of: NotificationSubject.shared, for: CustomMainActorMessage.self) { message in
self.label.text = "\(message.info)"
}
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
NotificationCenter.default.post(CustomMainActorMessage(info: "you have a new message"), subject: NotificationSubject.shared)
}
deinit {
NotificationCenter.default.removeObserver(mainActorMessageToken)
}
}
