Swift – Parse – Check if username is taken

I am trying to create a function that takes a username as a parameter and checks to see if that username is taken (by comparing it to other PFUsers in the Parse database. This function is in my view controller class. (I know there are similar questions to this but they do not provide quality answers and are more general than this or are not in Swift).

func usernameIsTaken(username: String) -> Bool {

    //bool to see if username is taken
    var isTaken: Bool = false

    //access PFUsers
    var query : PFQuery = PFUser.query()!
    query.whereKey("User",  equalTo: username)

    query.findObjectsInBackgroundWithBlock {
        (objects: [AnyObject]?, error: NSError?) in

        if error == nil {
            if (objects!.count > 0){
                isTaken = true
                println("username is taken")
            } else {
                println("Username is available. ")
            }
        } else {
            println("error")
        }
    }

    return isTaken

}

The problem is that the condition in the if statement is always false so “Username is available” always prints in the console even if the username is taken.”Username is taken” is never printed even when the username is taken. What should I put in the nested if statement to check if the username matches another PFUser?

  • How to add BackButton Facility MFSlidemenu?
  • Simulator slow-motion animations are now on?
  • Handling In-Call Status Bar with Custom Modal Presentation
  • iOS Project Update Xcode 4.2 to Xcode 4.5
  • How can I replace text in UITextView with NSUndoManager support?
  • Modal UINavigationController - I cant stop rotation
  • 3 Solutions Collect From Internet About “Swift – Parse – Check if username is taken”

    You are querying for User (class) key, but you need to query for a specific key, for example email.

    // First get user's inputted email
    let enteredEmailAddress = "sample@gmail.com"
    
    // Then query and compare
    var query = PFQuery(className: "_User")
    query.whereKey("email", equalTo: enteredEmailAddress)
    query.findObjectsInBackgroundWithBlock {
        (objects: [AnyObject]?, error: NSError?) in
        if error == nil {
            if (objects!.count > 0){
                isTaken = true
                println("username is taken")
            } else {
                println("Username is available. ")
            }
        } else {
            println("error")
        }
    }
    

    Just thought I would throw this out there, since this doesn’t seem to be well known by people as I’ve answered a similar question before. Parse does this kind of checking for the user class automatically. If you’re trying to create a new user with any of the default fields duplicated in Parse i.e username, email, etc, then Parse will not allow user signup. This is done automatically, with you having to do nothing, except for present the error so the user knows why they weren’t able to sign up successfully. An example of signing a user up that checks for username email etc duplicates follows below:

    user.signUpInBackgroundWithBlock {
                (succeeded: Bool, signupError: NSError?)
                -> Void in
    
                if signupError == nil {
                    //present new controller
                    println("Signed up")
    
                }
                else {
                    if let errorString = signupError!.userInfo?["error"] as? NSString
                    {
                        error = errorString as String
                    }
                    else {
                        error = "We're sorry, an error ocured! Please try again."
                    }
    
                    self.displayAlert("Could not sign up", error: error)
                }
            }
        }
    

    Check the error code. Last time I did this, code 202 = Username Taken, code 203 = e-mail taken.

                if signupError == nil {
    
                    print("User \(user.username!) signed up OK!")
    
    
                } else if signupError?.code == 202 {
    
                    print("Username taken. Please select another")
    
    
                } else if signupError?.code == 203 {
    
                    print("e-Mail taken. Please select another")
    
    
                }