【发布时间】:2017-06-22 17:17:49
【问题描述】:
使用 XCode-8.2.1、Swift-3.0.2 和 iOS-10.2.1,
我正在尝试调用两个不同的 URLSession.shared.dataTasks(第一个是简单的 URL 请求,第二个是 POST 请求)。
由于我的第一个 dataTask 传递了第二个 dataTask 的 httpBody 所需的结果,因此两个 URLSession.shared.dataTask 应该一个接一个地连续运行! (准备代码也要连续运行)。
到目前为止,我尝试使用两个连续的serialQueue.sync{} 队列。但我不得不意识到代码并没有按照我想要的顺序执行。
日志中的打印语句如下:
Hmmmmmm 2
Hmmmmmm 1
Hmmmmmm 3
(根据需要代替 1、2、3)!
1、2、3的顺序怎么得到??
(即如何确保第二个 dataTask 的 httpBody 可以填充来自第一个 dataTask 的结果?)
这是我的代码:(不可执行,因为 URL 已被删除 - 但你明白了)!
import UIKit
class ViewController: UIViewController {
let serialQueue = DispatchQueue(label: "myResourceQueue")
var stationID: Int = 0
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
self.serialQueue.sync {
let myResourceURL = URL(string: "myQueryString1")
let task = URLSession.shared.dataTask(with: myResourceURL!) { (data, response, error) in
if (error != nil) {
// print(error.debugDescription)
} else {
if let myData = data {
do {
let myJson = try JSONSerialization.jsonObject(with: myData, options: JSONSerialization.ReadingOptions.mutableContainers) as AnyObject
// print(myJson)
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
print("Hmmmmmm 1")
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
} catch {
// error
}
}
}
}
task.resume()
}
self.serialQueue.sync {
var request = URLRequest(url: URL(string: "myQueryString2")!)
request.httpMethod = "POST"
request.addValue("API_id", forHTTPHeaderField: "Authorization")
request.addValue("application/xml", forHTTPHeaderField: "Content-Type")
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
print("Hmmmmmm 2")
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
let postString: String = "My_XML_POST_Body"
request.httpBody = postString.data(using: .utf8)
let task = URLSession.shared.dataTask(with: request) { data, response, error in
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
print("Hmmmmmm 3")
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
}
task.resume()
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
任何帮助表示赞赏!
【问题讨论】:
-
搞笑 - 我想在 19 小时后知道同样的事情! :)
-
你说得对,URLSession.shared.dataTask 好像跳出了serialQueue。
-
另一种方法是使用(a)具有
maxConcurrentOperationCount或1的操作队列;或 (b) 您在操作之间建立依赖关系。但要使其正常工作,您需要执行异步Operation/NSOperation子类,例如 stackoverflow.com/questions/32322386/…。
标签: synchronization grand-central-dispatch nsurlsessiondatatask urlsession