XCode-8.2.1、Swift-3.0.2、および iOS-10.2.1 を使用して、
2 つの異なる URLSession.shared.dataTasks を呼び出そうとしています (1 つ目は単純な URL リクエストで、2 つ目は POST リクエストです)。
最初の dataTask は 2 番目の dataTask の httpBody で必要な結果を提供するため、2 つの URLSession.shared.dataTask は順番に実行されます。(また、準備コードは連続して実行されます)。
これまでのところ、2 つの連続しserialQueue.sync{}
たキューを使用してみました。しかし、コードが思い通りに実行されないことを認識しなければなりませんでした。
ログの print-statement は次のようになります。
Hmmmmmm 2
Hmmmmmm 1
Hmmmmmm 3
(必要に応じて 1、2、3 の代わりに)!
1、2、3 の順序を取得するにはどうすればよいですか??
(つまり、2 番目の 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.
}
}
どんな助けでも大歓迎です!