[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