2016-11-09 142 views
2

我想首先发布到网站,然后再获取另一个网站的数据。如何在另一个Alamofire请求中运行Alamofire请求?

然后在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 
     }) 
    }) 
} 

我怎样才能解决这个问题?

感谢

回答

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

谢谢,我将更多地了解同步和异步 – liux

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