【问题标题】:How to check Alamofire request has completed如何检查 Alamofire 请求是否已完成
【发布时间】:2015-08-14 10:35:45
【问题描述】:

我正在使用 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()
}

谢谢。

【问题讨论】:

    标签: ios swift alamofire


    【解决方案1】:

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

    【讨论】:

    • 所以当我调用“tableUsers.reloadData()”时,“用户”已经完全加载了?
    • 如果 getUsers() 是在您的问题中调用 Alamofire 请求的方法,那么是的。
    • 但是没有。我已经检查过了。当我将它设置为计时器时,它会加载表格。否则不加载
    • 您检查过您的项目length吗?如果为 0 则用户 array 将为空
    • 我认为该方法无法正常工作。因为如果我检查时没有拉出所有用户,它只会显示几个
    【解决方案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 方法的完成处理程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-06
      • 1970-01-01
      • 2017-11-13
      • 1970-01-01
      • 2018-06-02
      • 1970-01-01
      • 1970-01-01
      • 2014-07-22
      相关资源
      最近更新 更多