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)!
答案 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
无需强行打开您知道存在的可选值