[swift-users] Class Variable delayed stored

Fritz Anderson fritza at manoverboard.org
Tue Oct 4 09:54:23 CDT 2016


On 3 Oct 2016, at 5:46 PM, jason bronson via swift-users <swift-users at swift.org> wrote:
> 
> I have this class I wrote which stores the error messages from the firebaseauth if a error occurs.
> The problem is that the variable on first return is not set and on second return is.
> variable _errorMsg is empty on first return of method registerUser
> 
> Why is it not storing the variable when it's initially triggered?

I assume you are talking about this function, which I’ll elide for purposes of discussion:

===
func registerUser(email : String, password: String) -> Bool{
    createdUser = false
    
    FIRAuth.auth()?.createUser(withEmail: email, password: password, completion: {(user, error) in
        if error != nil {
            // ...
        }else{
            print("DEBUG: New user created ")
            self.createdUser = true
        }
    })
    
    return self.createdUser
}
===

The error parameter to the closure; the nature of the task, which must surely involve turnaround from another process or host; and the compiler error telling you (I’m betting) to refer explicitly to self in the closure; are a tipoff that the closure escapes. Escaping closures do not return to the code that presented them (or they don’t promise to; see below). createUser(withEmail:password:completion:) merely registers your completion (result) handler; it does not execute it; it waits in the background until the remote process responds. registerUser(... proceeds while createUser(... waits.

Upon the first call with that email/password combination., none of the code in your closure — including the part that sets self.createdUser to true — will have run by the time you return self.createdUser. By the end of registerUser(..., createdUser is still false.

---

As for the second return I’m guessing something like this: createUser(... caches the success of the last time it executed with that email/password pair. It sees there’s no need for a round trip through the external process, so it executes the completion closure immediately, with error == nil. The closure sets self.createdUser = true before it returns to your function. Your function returns the true.

	— F

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20161004/5ad1d07f/attachment.html>


More information about the swift-users mailing list