0

En essayant de mettre à jour une variable à l'intérieur d'une classe, le statut "var CurrentStatus: status!" Est une énumération. J'ai une fonction firebase qui mettra à jour la variable. la variable get update à l'intérieur de la fonction firebase mais elle ne mettra pas à jour la variable en dehors de la fonction firebaseComment puis-je accéder à la variable firebase en dehors de la fonction firebase?

class signUpClass:UIViewController { 

    // check to see if form is empty 

    let ihelpController = UIViewController() 
    var CurrentStatus:status! 

    func signUp(var formArray: [String:String]) -> status{ 

     var formStatus:status = ihelpController.checkIfFormIsEmpty(formArray) 

     if (formStatus == status.success){ 
      //form is ok to process 
      // check DOB 
      //TODO: create date calculation function 

      let DateOfBirth:Int = 18 

      if DateOfBirth < 18 { 
       //user is not 18 they can not register 
       alertError("oops", message: "You must be 18 to register", comfirm: "Ok") 

      } else { 
       //Proceed with registration 
       let firebaseController = Firebase() 
       var email = "[email protected]" 
       var password = "1234" 

       firebaseController.refPath("users").createUser(email, password: password, withValueCompletionBlock: {error, result in 

        if error != nil { 
         print("registration Error") 
         self.alertError("oops", message: "That email is registered already", comfirm: "OK") 

        } else { 
         let vc = 
         print("user can register") 
         firebaseController.firebaseRefUrl().authUser(email, password: password, withCompletionBlock:{ 
          error, authdata in 

          if error != nil { 

           print("login Error") 
          }else{ 

           let userId = firebaseController.firebaseRefUrl().authData.uid 

           formArray["userId"] = userId 

           firebaseController.refPath("users/\(userId)").updateChildValues(formArray) 
           print("user is register and can proceed to dashBoard") 

           //Proceed to dashboard 
           self.CurrentStatus = status.success 
          } 

         }) 

        } 
       }) 

      } 




     } 
     return CurrentStatus 

    } 
+2

Eh bien, tout de suite la chauve-souris, vous ne pouvez pas utiliser Firebase comme une fonction pour retourner une valeur. Cela ne fonctionne pas comme ça. Firebase est asynchrone donc les données ne seraient disponibles qu'avec le bloc (closure) attaché à l'observer. En d'autres termes, le reste de votre code est en cours d'exécution avant que Firebase ne renvoie ses données. Deuxièmement, vous définissez correctement le statut self.Current dans le bloc, mais le retourner remplacera probablement ce qui a été défini, à nouveau parce que les données ne sont valides que dans la fermeture. – Jay

Répondre

1

D'accord avec le commentaire de Jay. Vous ne pouvez pas retourner le statut comme ça parce que fonctionne les bases de feu de façon asynchrone ... ce que je ferais, est d'ajouter un paramètre de fermeture que les exécutions à l'achèvement comme si:

classe signUpClass: UIViewController {

// check to see if form is empty 

let ihelpController = UIViewController() 
var CurrentStatus:status! 

func signUp(var formArray: [String:String], complete:(CurrentStatus)->()){ 

    var formStatus:status = ihelpController.checkIfFormIsEmpty(formArray) 

    if (formStatus == status.success){ 
     //form is ok to process 
     // check DOB 
     //TODO: create date calculation function 

     let DateOfBirth:Int = 18 

     if DateOfBirth < 18 { 
      //user is not 18 they can not register 
      alertError("oops", message: "You must be 18 to register", comfirm: "Ok") 

     } else { 
      //Proceed with registration 
      let firebaseController = Firebase() 
      var email = "[email protected]" 
      var password = "1234" 

      firebaseController.refPath("users").createUser(email, password: password, withValueCompletionBlock: {error, result in 

       if error != nil { 
        print("registration Error") 
        self.alertError("oops", message: "That email is registered already", comfirm: "OK") 

       } else { 
        let vc = 
        print("user can register") 
        firebaseController.firebaseRefUrl().authUser(email, password: password, withCompletionBlock:{ 
         error, authdata in 

         if error != nil { 

          print("login Error") 
         }else{ 

          let userId = firebaseController.firebaseRefUrl().authData.uid 

          formArray["userId"] = userId 

          firebaseController.refPath("users/\(userId)").updateChildValues(formArray) 
          print("user is register and can proceed to dashBoard") 

          //Send status to callback to handle 
          complete(status.success) 
         } 
        }) 
       } 
      }) 
     } 
    } 
}