Swift - 使用FireBase登录 - 登录后无法检索用户数据

时间:2016-09-09 03:41:01

标签: ios swift firebase firebase-authentication

Firebase身份验证 - 登录后无法检索用户数据。

我正在尝试在登录(logincontroller)后检索用户电子邮件,并将其显示在另一个控制器(maincontroller)上的UILABEL中。当您创建用户或使用现有用户时,它在启动应用程序后第一次正常工作,但当您退出并尝试使用其他电子邮件时,它无效。

我有两个视图控制器:

import UIKit
import Firebase
import FirebaseAuth
import FirebaseDatabase

class LoginViewController: UIViewController {

    var ref: FIRDatabaseReference!


    @IBOutlet weak var emailTextField: UITextField!
    @IBOutlet weak var passwordTextField: UITextField!


    override func viewDidLoad() {
        super.viewDidLoad()

        ref = FIRDatabase.database().reference()

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func signInButton(sender: AnyObject) {
        FIRAuth.auth()?.signInWithEmail(emailTextField.text! , password: passwordTextField.text!, completion: { (user, error) in

            if error != nil {
                print(error!.localizedDescription)
            }
        })

        self.performSegueWithIdentifier("MainViewSegue", sender: self)
    }

    @IBAction func createAccountButton(sender: AnyObject) {
        FIRAuth.auth()?.createUserWithEmail(emailTextField.text!, password: passwordTextField.text!, completion: { (user, error) in

            if error != nil {
                print(error!.localizedDescription)
            } else {

                print("User Created.")
                let userID: String = user!.uid
                let userEmail:String = self.emailTextField.text!
                self.ref.child("users").child(userID).setValue(["email": userEmail])
            }
        })
    }
}

import Foundation
import UIKit
import Firebase
import FirebaseDatabase

class MainViewController: UIViewController {

    var ref: FIRDatabaseReference!
    var refHandle: UInt!

    @IBOutlet weak var userEmailLabel: UILabel!

    override func viewDidLoad() {

        super.viewDidLoad()

        ref = FIRDatabase.database().reference()

        refHandle = ref.observeEventType(FIRDataEventType.Value, withBlock: { (snapshot) in
            let dataDict = snapshot.value as! [String: AnyObject]

            print((dataDict))
        })


        let userID: String = (FIRAuth.auth()?.currentUser?.uid)!
        ref.child("users").child(userID).observeSingleEventOfType(.Value, withBlock: { (snapshot) in
            let userEmail = snapshot.value!["email"] as! String
            self.userEmailLabel.text = userEmail
        })
    }

    @IBAction func signOutButton(sender: AnyObject) {
        try! FIRAuth.auth()!.signOut()
        if let storyboard = self.storyboard {
            let viewController = storyboard.instantiateViewControllerWithIdentifier("LoginViewController")
            self.presentViewController(viewController, animated: false, completion: nil)
        }
    }
}

这是我收到错误EXC_BAD_INSTRUCTION

的地方
let userID: String = (FIRAuth.auth()?.currentUser?.uid)! 

1 个答案:

答案 0 :(得分:1)

signInWithEmail FIRAuth.auth()?.signInWithEmail(emailT...

CMD +点击,您将看到其文档,在其文档上方您将看到: -

  

@param completion可选;登录流程完成时调用的块,或者是               取消。将来在主线程上异步调用。

这意味着当您的用户登录或 signInWithEmail 功能发出错误时,系统会调用您的completionBlock。但在您的情况下self.performSegueWithIdentifier("MainViewSegue", sender: self)甚至会在您的用户被调用之前被调用completionBlock:被称为。{/ p>

试试这个: -

  @IBAction func signInButton(sender: AnyObject) {
    FIRAuth.auth()?.signInWithEmail(emailTextField.text! , password: passwordTextField.text!, completion: { (user, error) in

        if error != nil {
            print(error!.localizedDescription)
        }else if error == nil{
                 self.performSegueWithIdentifier("MainViewSegue", sender: self)
          }
    })
}

同时替换: -

let userID: String = (FIRAuth.auth()?.currentUser?.uid)!

let userID: String = FIRAuth.auth()!.currentUser!.uid

无需强行打开您知道存在的可选值

相关问题