[swift-users] Class Variable delayed stored

jason bronson jasonbronson at gmail.com
Tue Oct 4 10:41:31 CDT 2016


Thanks I'll need to find another method for handling the asynchronous
delays.

On Tuesday, October 4, 2016, Fritz Anderson <fritza at manoverboard.org> wrote:

> On 3 Oct 2016, at 5:46 PM, jason bronson via swift-users <
> swift-users at swift.org
> <javascript:_e(%7B%7D,'cvml','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
>
>

-- 
Sent from Gmail Mobile
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20161004/2d3a732a/attachment.html>


More information about the swift-users mailing list