LIH LIH - 11 months ago 148
Swift Question

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.

Answer Source

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)
    }