我想首先发布到网站,然后获取另一个网站获取数据。
并更改POST中的密钥,并在for循环中继续执行此操作5次以获取不同的数据。
然而,程序总是首先运行POST 5次,然后再运行GET 5次,这使我得到相同的数据。
以下是代码:
for i in 1...5{
let postData: Parameters = ["key": "\(i)"]
Alamofire.request(" POST Website", method: HTTPMethod.post, parameters: postData, encoding: URLEncoding.default, headers: self.headers).response(completionHandler: { (ressponse) in
Alamofire.request(" GET Website ", method: HTTPMethod.get, headers: self.headers).response(completionHandler: { (response) in
// Get Data
})
})
}
我该如何解决这个问题?
由于
答案 0 :(得分:2)
如果你想在开始下一个请求之前等到第一个请求完成,你需要从完成处理程序中启动你的下一个请求:
func getData (count: Int) {
let postData: Parameters = ["key": "\(count)"]
Alamofire.request(" POST Website", method: HTTPMethod.post, parameters: postData, encoding: URLEncoding.default, headers: self.headers).response(completionHandler: { (ressponse) in
Alamofire.request(" GET Website ", method: HTTPMethod.get, headers: self.headers).response(completionHandler: { (response) in
if count > 0 {
self.getData(count - 1)
}
})
})
}
}
答案 1 :(得分:1)
您应该了解同步和异步操作之间的区别。这里有关于SO或其他任何地方的主题有很多答案。 Example
基本上你的for
循环几乎立即执行,它不会等待来自POST或GET请求的任何响应。每次在循环内部安排POST请求,每次完成后,都会发送另一个GET请求。所以你得到了这种行为:
POST, POST, POST, POST, POST .......... GET, GET, GET, GET, GET
如果你想这样:
POST .... GET ..... POST ...... GET ...... and so on ....
收到GET请求的响应后,您应该调用POST请求,如下所示:
func postRequest(index: Int, count: Int) {
if count > 0 {
let postData: Parameters = ["key": "\(index)"]
Alamofire.request(" POST Website", method: HTTPMethod.post, parameters: postData, encoding: URLEncoding.default, headers: self.headers).response(completionHandler: { (response) in
Alamofire.request(" GET Website ", method: HTTPMethod.get, headers: self.headers).response(completionHandler: { (response) in
// Get Data
postRequest(index+1, count-1)
})
})
}
}