应用程序激活后,布局更新缓慢

时间:2017-05-02 12:16:36

标签: ios swift

我的目标是检查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
    }
  }
}

1 个答案:

答案 0 :(得分:3)

getNotificationSettings基本上会异步请求通知设置 ,因此执行完成块需要一些时间。

上述方法的Apple文档也说完成块可能在后台线程上执行。但是,与UI交互的所有内容都必须在主线程上运行,否则您将遇到与您在案例中遇到的问题类似的问题。

你应该用DispatchQueue.main将它包起来,将与UI相关的工作转发到主队列,一切都应该按预期工作:

self.center.getNotificationSettings { settings in
  DispatchQueue.main.async { 
    self.notificationSwitch.isOn = (settings.authorizationStatus == .authorized)
  }
}