2017-05-02 18 views
1

私の目標は、承認ステータスを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

getNotificationSettingsは基本的に非同期的にこのアプリの通知設定を要求したので、完了ブロックが実行されるまでには、ある程度の時間を要します。

上記の方法に関するAppleのマニュアルにも、完了ブロックがバックグラウンドスレッドで実行されることが記載されています。ただし、UIとやりとりするものはすべてメインスレッドで実行する必要があります。そうしなければ、あなたの場合のように定期的に実行されないことがあります。

あなたはメインキューにUI関連の仕事を中継するDispatchQueue.mainでそれをラップする必要があり、すべてが期待通りに動作するはずです:

self.center.getNotificationSettings { settings in 
    DispatchQueue.main.async { 
    self.notificationSwitch.isOn = (settings.authorizationStatus == .authorized) 
    } 
} 
関連する問題