如何检查Alamofire请求已经完成

时间:2015-06-01 04:10:43

标签: ios swift alamofire

我正在使用 Swift 开发 iPad 应用程序。对于http请求,我使用 Alamofire 库。到目前为止,我已经设法从API中提取了一些数据。但问题是因为它是异步调用我不知道如何检查请求是否已完成。任何帮助,将不胜感激。

这是我到目前为止实施的代码

客户端类

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

}

主要课程

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

谢谢。

2 个答案:

答案 0 :(得分:3)

请求完成后,将调用 Alamofire请求的关闭部分。我已经使用了您的代码并对请求已完成的行进行了评论:

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

答案 1 :(得分:2)

如果您希望tableView在通过网络成功获取数据后重新加载数据,则需要在该完成处理程序中调用tableUsers.reloadData(),如下所示:

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
}

如果您没有指定队列,Alamofire会确保在主队列上调用完成处理程序。您无需添加代码即可再次在mainThread上调用。

最初的问题:Alamofire告诉您已完成请求的唯一方法是调用您为Alamofire.request方法提供的完成处理程序。