es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo espero a que una función de Firebase se complete antes de continuar mi flujo de código en SwiftUI?

Tengo una función de Firebase en una clase (listenToUser) que funciona bien, pero noté que el siguiente código (el IF ELSE) no espera a que se complete antes de continuar. ¿Cómo puedo esperar a que mi función se complete antes de continuar con mi código?

Porción de código de mi vista principal:

...
@EnvironmentObject var firebaseSession: FirebaseSession_VM
...

.onAppear {
    firebaseSession.listenToUser()

    if firebaseSession.firebaseUser == nil {
        showSignInView = true
    } else {
        showSignInStep1View = true
    }
}

Mi función:

import SwiftUI
import Combine
import FirebaseAuth

class FirebaseSession<em>VM: ObservableObject {
    static let instance = FirebaseSession</em>VM()

    var didChange = PassthroughSubject<FirebaseSession_VM, Never>()

    @Published var firebaseUser: FirebaseUser_M? {
        didSet {
            self.didChange.send(self)
        }
    }

    var handle: AuthStateDidChangeListenerHandle?

    func listenToUser () {
        // monitorear los cambios de autenticación utilizando Firebase
        handle = Auth.auth().addStateDidChangeListener { (auth, user) in
            if let user = user {
                self.firebaseUser = FirebaseUser_M(
                    id: user.uid,
                    email: user.email
                )
            } else {
                self.firebaseUser = nil
            }
        }
    }
}
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para esperar a que la función de Firebase se complete antes de continuar con el código, puedes utilizar un controlador de finalización. Aquí tienes un ejemplo de cómo modificar tu código para esperar a que la función se complete:

    ...
    
    @EnvironmentObject var firebaseSession: FirebaseSession_VM
    
    ...
            .onAppear {
                firebaseSession.listenToUser() {
                    if firebaseSession.firebaseUser == nil {
                        showSignInView = true
                    } else {
                        showSignInStep1View = true
                    }
                }
            }
    
    ...
    
    
    class FirebaseSession_VM: ObservableObject {
        // ...
    
        func listenToUser (completion: @escaping () -> Void) {
            // monitorear cambios de autenticación utilizando firebase
            handle = Auth.auth().addStateDidChangeListener { (auth, user) in
                if let user = user {
                    self.firebaseUser = FirebaseUser_M(
                        id: user.uid,
                        email: user.email
                    )
                } else {
                    self.firebaseUser = nil
                }
                completion() // llamar al controlador de finalización después de que la función se complete
            }
        }
    
        // ...
    }
    

    En este código modificado, ahora la función listenToUser toma un controlador de finalización como parámetro. El controlador de finalización es un cierre (un bloque de código) que se ejecutará cuando la función esté completa.

    El bloque onAppear ahora llama a listenToUser con un cierre que contiene el código que se ejecutará después de que la función esté completa. Este código no se ejecutará hasta que la función esté completa y se llame al controlador de finalización.

Comments are closed.