使用带循环的 Alamofire 根据 Tableview 计数发送多个请求

Using Alamofire with a loop to send multiple requests based on Tableview count

我正在尝试使用 for 循环基于 tableview 计数发送多个请求。我知道 Alamofire 是异步的。我遇到的问题是当我使用循环调用函数时,x 值变得与响应不同步,因为它是异步的。什么是从根本上保护传递到 POST 请求的 int 值的最佳方法,直到完成处理程序 returns 一个值。同步方法是最好的还是有办法异步传递多个值?如果是这样,我将如何实施?

    for var x = 0; x < tableArray.param.count; ++x { // how to lock x value until Tasks completes

    Alamofire.request(.POST, "https://mygateway/rest/dosomething/\(x)", parameters : parameters, encoding: .JSON)
    .responseJSON {
        (request, response, json) in

        if json.value != nil {

            let statuses = JSON(json.value!)

            for (key, value): (String, JSON) in statuses {

                if key == "revision" {

                    let rev = value

                    self.tableArray.param[x].revision = rev.stringValue
                    // this determines the table cell setup
                }
            }
        }
    }
}
self.tableView.reloadData()

因为 x 已声明为 var。闭包将捕获 x 作为可变版本。因此,x会在循环通过时增加超时。

您可以用 let 捕获 x。因为 let 是不可变的。它永远不会改变。在闭包内使用该值。例如

for var x = 0; x < tableArray.param.count; ++x {  
    let capturedX = x
    // do something with capturedX
    self.tableArray.param[capturedX].revision = rev.stringValue
}

或者只使用范围循环。更优雅干净。

for x in 0..< tableArray.param.count{
    // do the same way you do with x
    // ...
}

尝试从请求中获取 x 值URL,而不是从 for 中获取 x。

像这样:

let stringX = request?.URL?.lastPathComponent
let intX = Int(stringX)
self.tableArray.param[intX].revision = rev.stringValue