使用Firebase 3和Swiftlogging用户仍会显示`currentUser`

我正尝试在iOS应用程序中使用Firebase 3login用户。 这是我的代码:

do { databaseReference.child("Users").child(CUUID!).removeAllObservers() try FIRAuth.auth()?.signOut() print("FIRUSER - \(FIRAuth.auth()?.currentUser)") self.performSegueWithIdentifier("logOutSegue", sender: self) } catch let logOutError { print("Error Logging User Out - \(logOutError)") } 

我想要做的是执行一个segue回到login屏幕,如果用户成功注销。 为了检查用户是否已注销,我打印currentUser以查看是否还有一个。 我打logOutbutton和segue工程(没有赶上 – >没有错误),但是当print("FIRUSER - \(FIRAuth.auth()?.currentUser)")代码运行时,我仍然得到currentUser。 为什么用户不被注销?

使用cmd+click try FIRAuth.auth()?.signOut() ,你将被引导到它的文档,在那里你会看到


  • @参数监听器要调用的块。 该块总是在主线程上asynchronous调用 ,即使在作为侦听器添加之后它也是初始调用。

  • @remarks根据标准调用语义在主线程上asynchronous地添加块后立即调用该块。


asynchronous ,这意味着您的用户注销查询将加载到networking链接中的一个单独的线程中,这需要时间(可能只有几毫秒,但仍…),并且即使在login用户之前,您的print行也会执行。为什么你仍然从firebase接收当前的用户… 🙂

尝试打印currentUser在执行segue后迁移到的类的viewWillAppear(animated:Bool) ,如果签出不捕获任何错误,则打印行必须显示nil。

PS: 假设 signOut()函数有一个completionBlock :,并且你尝试在那里打印currentUser ,你可能会发现零,并且可能会崩溃你的应用程序…再次,这只是假设

顺便说一句:获取当前用户的最佳方法是在Auth对象上设置一个监听器

  FIRAuth.auth()?.addAuthStateDidChangeListener { auth, user in if let user = user { // User is signed in. } else { // No user is signed in. } } 

Firebase文档: – 获取当前用户 – Firebase文档