使用带循环的 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
我正在尝试使用 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