Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Wait for completion handler to finish before returning

    func checkUsername(username: String) -> Bool {
        var avalible = true
        
        Database.database().reference().child("usernames").child(username).observeSingleEvent(of: .value, with: { snapshot in
            if snapshot.exists() {
                print("exists")
                avalible = false
            }
        })
        
        return available
    }

I’m trying to check if a username exists.
I’ve already tried multiple things, but it seems like the function always returns before the completion handler even finishes and always gives the same output (true) even if the username is already taken.

Does somebody have an idea how to „wait“ for the completion handler first to finish before returning the „available“ variable?

An explanation with the answer would be excellent.
Thanks.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

>Solution :

You cannot return something from an asynchronous task. Your code – with fixed typos – returns true even before the database request has been started.

Maybe there is a native async/await version of observeSingleEvent but in any case you can use a Continuation

func checkUsername(username: String) async -> Bool {
    return await withCheckedContinuation { continuation in
        Database.database().reference().child("usernames").child(username).observeSingleEvent(of: .value, with: { snapshot in
            continuation.resume(returning: !snapshot.exists())
        })
    }
}

And call it

Task {
   let isAvailable = await checkUsername(username: "Foo")

}
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading