我的目标是检查UNUserNotificationCenter
的授权状态(当应用再次处于活动状态/进入前景时(,并根据信息打开或关闭UISwitch
。
该功能有效并立即触发,但是Uiswitch需要3-5秒才能更新。有更好的方法更新吗?
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(checkNotificationSettings), name: NSNotification.Name.UIApplicationDidBecomeActive, object: nil)
}
func checkNotificationSettings() {
self.center.getNotificationSettings { (settings) in
switch settings.authorizationStatus {
case .authorized:
self.notificationSwitch.isOn = true
case .notDetermined, .denied:
self.notificationSwitch.isOn = false
}
}
}
getNotificationSettings
基本上请求通知设置异步,因此需要一些时间直到执行完成块。
上述方法的Apple文档还表示,可以在背景线程上执行完成块。但是,与UI相互作用的所有内容都必须在主线程上运行,否则您将遇到类似于案件中遇到的问题。
您应该用DispatchQueue.main
将其包裹起来,以将与UI相关的工作传递给主要队列,并且一切都应按预期工作:
self.center.getNotificationSettings { settings in
DispatchQueue.main.async {
self.notificationSwitch.isOn = (settings.authorizationStatus == .authorized)
}
}