2017-12-29 30 views
1

내 SettingsVC에서 AppDelegate의 didFinishLaunchingWithOptions 기능에 의해 관찰 된 NSNotification.Name(rawValue: "LogOut")의 알림을 보냅니다.사용자 로그 아웃으로 인해 응용 프로그램이 충돌 함

알림을 받으면 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

당신이 알고, setViewControllers''전 User.logout()','후, 얼마나 많은 ViewC ontrollers가 탐색 스택에 있습니까? –

+0

두 명. 아마 어딘가에 강력한 참고가있을 것입니다. 그게 네가 얻고있는거야? –

답변

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'가 틀리다고 잘못 생각하고 있으며, 메인 큐 데드락 (몇 초 후에 앱을 종료합니다)으로 이어질 수 있습니다. 루트로 팝핑하는 것은 아마도 필요하지 않습니다. 그러나 실제 충돌은 무엇입니까? 일반적으로 로그에 문제를 알려주는 메시지가 있습니다. –