使用Firebase 3和Swift记录用户仍会显示`currentUser`

Dan*_*evy 3 xcode ios firebase swift firebase-authentication

我想在我的iOS应用程序中使用Firebase 3登录用户.这是我的代码:

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)")
    }
Run Code Online (Sandbox Code Playgroud)

我想要做的是如果用户成功注销,则执行segue返回登录屏幕.为了检查用户是否已注销,我打印currentUser以查看是否还有用户.我按下logOut按钮并且segue工作(没有捕获 - >没有错误),但是当print("FIRUSER - \(FIRAuth.auth()?.currentUser)")代码运行时,我仍然得到一个currentUser.为什么用户没有注销?

Dra*_*ian 17

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


  • @param listener要调用的块.始终在主线程上异步调用该块,即使在将其添加为侦听器之后进行初始调用也是如此.

  • @remarks在根据它的标准调用语义添加它之后立即调用该块,在主线程上异步.


异步这意味着您注销用户的查询是在网络链接中的一个单独的线程中加载的,这需要时间(可能只有几毫秒,但仍然是......)并且print甚至在用户注销用户之前就会执行您的行.这就是原因为什么你仍然从firebase 收到currentUser ... :)

尝试在执行segue之后在您迁移到的类的viewWillAppear(animated:Bool)中打印currentUser,如果它注销没有捕获任何错误,则打印行必须显示为nil.

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

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

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

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