LIH
LIH

Reputation: 933

How to check Alamofire request has completed

I am developing an iPad application using Swift. For http requests I use Alamofire library. So far I have managed to pull some data from an API. But the problem is since it is an asynchronous call I don't know how to check whether the request has completed. Any help would be appreciated.

This is the code I have implemented so far

Client class

func getUsers(completionHandler: ([User]?, NSError?) -> ()) -> (){

    var users: [User] = []
    let parameters = [
        "ID": "123",
        "apikey": "1234",
    ]

    Alamofire.request(.GET, "API_URL", parameters: parameters).responseJSON() {
        (_, _, JSON, error) in
        let items = (JSON!.valueForKey("Users") as! [NSDictionary])
        for item in items {
            var user: User = User()
            user.userId = item.valueForKey("ID")! as? String
            user.userName = item.valueForKey("Name")! as? String
            user.group = item.valueForKey("Group")! as? String
            users.append(user)
        }
        completionHandler(users, error)
    }

}

Main class

func getUsers(){
    FacilityClient().getUsers() { (users, error) -> Void in
        if users != nil {
            self.users = users!
        } else{
            println("error - \(error)")
        }
    }
    tableUsers.reloadData()
}

Thank you.

Upvotes: 4

Views: 4940

Answers (2)

Nicholas T.
Nicholas T.

Reputation: 76

If you want the tableView to reload data after successfully fetching data over network, you will need to call tableUsers.reloadData() inside that completion handler, like this:

func getUsers(){
    FacilityClient().getUsers() { (users, error) -> Void in
        if users != nil {
            self.users = users!
            tableUsers.reloadData() // SHOULD be here
        } else{
            println("error - \(error)")
        }
    }
    // tableUsers.reloadData() // WAS here
}

And Alamofire make sure the completion handler is called on main queue if you don't specify a queue. You don't need to add code to make it be called on mainThread again.

And to your originally question: The only way Alamofire let you know a request has completed is by calling that completion handler which you give to the Alamofire.request method.

Upvotes: 2

ezcoding
ezcoding

Reputation: 2994

The closure part of the Alamofire request is called, when the request has completed. I've used your code and commented the line where the request hast finished:

Alamofire.request(.GET, "API_URL", parameters: parameters).responseJSON() {
        (_, _, JSON, error) in
      //
      // The request has finished here. Check if error != nil before doing anything else here.
      //            
        let items = (JSON!.valueForKey("Users") as! [NSDictionary])
        for item in items {
            var user: User = User()
            user.userId = item.valueForKey("ID")! as? String
            user.userName = item.valueForKey("Name")! as? String
            user.group = item.valueForKey("Group")! as? String
            users.append(user)
        }
      //
      // After creating the user array we will call the completionHandler, which probably reports back to a ViewController instance
      //
        completionHandler(users, error)
    }

Upvotes: 3

Related Questions