Nano Hash - криптовалюты, майнинг, программирование

Swift - Войти с помощью FireBase - Не удается получить данные пользователя после входа в систему

Аутентификация Firebase — не удается получить данные пользователя после входа в систему.

Я пытаюсь получить электронную почту пользователей после входа в систему (logincontroller) и отобразить ее в UILABEL на другом контроллере (maincontroller). Когда вы создаете пользователя или используете существующего, он отлично работает в первый раз после запуска приложения, но когда вы выходите из системы и пытаетесь использовать другой адрес электронной почты, он не работает.

У меня есть два контроллера представления:

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)! 

  • он печатает ноль. 09.09.2016

Ответы:


1

CMD+CLICK на signInWithEmail в FIRAuth.auth()?.signInWithEmail(emailT..., и вы будете перенаправлены к его документации, над этой функцией в документации вы увидите: -

завершение @param Необязательно; блок, который вызывается, когда процесс входа завершается или отменяется. Вызывается асинхронно в основном потоке в будущем.

что означает, что ваш завершениеBlock вызывается, когда ваш пользователь либо вошел в систему, либо функция signInWithEmail выдала некоторую ошибку. Но в вашем случае self.performSegueWithIdentifier("MainViewSegue", sender: self) будет вызываться даже до того, как будет вызван ваш completionBlock:.

Попробуй это:-

  @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

Нет необходимости принудительно разворачивать необязательное значение, которое, как вы знаете, существует

09.09.2016
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..