2017-12-29 13 views
1

自分のSettingsVCで、NSNotification.Name(rawValue: "LogOut")の通知を送信します。この通知は、AppDelegateのdidFinishLaunchingWithOptions機能によって観察されます。ユーザのログアウトによりアプリがクラッシュする

通知を受け取ったら、私はUser.logoutに電話してすべてのユーザーデータを消去し、DispatchQueueブロックでアプリがクラッシュします。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 

    window = UIWindow(frame: UIScreen.main.bounds) 
    window?.backgroundColor = .white 

    NotificationCenter.default.addObserver(forName: NSNotification.Name(rawValue: "LogOut"), object: nil, queue: nil) { _ in 
     User.logout() 

     DispatchQueue.main.sync { 
      self.navigationController?.setViewControllers([WelcomeViewController()], animated: false) 
     } 
    } 

    if let _ = UserDefaults.standard.string(forKey: "loggedIn") { 
     self.navigationController = UINavigationController(rootViewController: HomeViewController()) 
    } else { 
     self.navigationController = UINavigationController(rootViewController: WelcomeViewController()) 
    } 

    window?.rootViewController = navigationController 
    window?.makeKeyAndVisible() 

    return true 
} 

追加情報なしでクラッシュします。どのようにこれをクラッシュさせないようにするか?ありがとう!

+0

'User.logout()'の後、 'setViewControllers'の前に、いくつのViewC ontrollersはナビゲーションスタックにありますか? –

+0

2つ。おそらく、どこかに強い参照があるかもしれません。それはあなたが得ているものですか? –

答えて

2

私はあなたが「クリア」、さらに、setViewControllersを呼び出す前に、ナビゲーションスタックすべきだと思う:バックグラウンドスレッドから同期

打ち上げメインスレッドをそれが

を終了する前に、より良い使用して、論理的に間違っていますasyncこのようにして:

NotificationCenter.default.addObserver(forName: NSNotification.Name(rawValue: "LogOut"), object: nil, queue: nil) { _ in 
    User.logout() 
    DispatchQueue.main.async { 
    self.navigationController?.popToRootViewController(animated: false) 
    self.navigationController?.setViewControllers([WelcomeViewController()], animated: false) 
    } 
} 
+0

同じクラッシュが発生しました –

+0

@ZackShapiroが回答を編集しました –

+1

Andreaは確かに 'sync'が間違っていて間違っていて、メインキューデッドロック(数秒後にアプリケーションを終了させるでしょう)につながる可能性があります。おそらくルートにポップする必要はありません。しかし、実際のクラッシュは何ですか?ログには通常、問題を伝えるメッセージがあります。 –

関連する問題