0

I'm very new to Parse and Swift and I have this project I am working on and I am trying to create a search bar that displays all the items from the key "names" from my Parse database.

I have created this function that is supposed to take all the names and return them in a string array. But instead, the array never gets filled and all I get as a return is [].

class Offices {
    var name: String
    var phone: String
    var location: String
    
    init(name: String = "def_name", phone: String = "def_phone", location: String = "def_location") {
        self.name = name
        self.phone = phone
        self.location = location
    }
    func retrieveName() -> [String] {
        var models = [String]()
        let queries = PFQuery(className: "Directory")
        queries.findObjectsInBackground { (object, error) in
            if let error = error {
                // The query failed
                print(error.localizedDescription)
            } else if let object = object {
                // The query succeeded with a matching result
                for i in object{
                    models.append(i["name"] as? String ?? self.name)
                }
                
            } else {
                // The query succeeded but no matching result was found
            }
            
        }
        return models
    }
2

1 Answer 1

2

findObjectsInBackground method is asynchronous. So you should change retrieveName function as below:

class Offices {
    var name: String
    var phone: String
    var location: String
    
    init(name: String = "def_name", phone: String = "def_phone", location: String = "def_location") {
        self.name = name
        self.phone = phone
        self.location = location
        
        // I call retrieveName here for example. You can call it where you want.
        retrieveName() { (success, models) in
            if success {
                print(models)
            } else {
                print("unsuceess")
            }
        }
    }

    func retrieveName(completion: @escaping (_ success: Bool, _ models: [String]) -> Void) {
        var models = [String]()
        let queries = PFQuery(className: "Directory")
        queries.findObjectsInBackground { (object, error) in
            if let error = error {
                // The query failed
                print(error.localizedDescription)
                completion(false, [])
            } else if let object = object {
                // The query succeeded with a matching result
                for i in object{
                    models.append(i["name"] as? String ?? self.name)
                }
                completion(true, models)
            } else {
                completion(true, [])
                // The query succeeded but no matching result was found
            }
        }
    }
}
Sign up to request clarification or add additional context in comments.

2 Comments

Not really sure what happens with async functions but it worked, thanks!
I suggest you reading below guide. Specially Escaping Closures section. docs.swift.org/swift-book/LanguageGuide/Closures.html

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.