Mit XCode-8.2.1, Swift-3.0.2 und iOS-10.2.1,Wie wird die serielle Warteschlange für URLSession-Aufgaben synchronisiert?
Ich versuche, zwei verschiedene URLSession.shared.dataTasks (die erste ist eine einfache URL-Anfrage und die zweite ist eine POST-Anfrage).
Da meine erste dataTask ein Ergebnis liefert, das in der httpBody der zweiten dataTask benötigt wird, sollen die beiden URLSession.shared.dataTasks nacheinander hintereinander laufen! (und auch der präparative Code soll fortlaufend ablaufen).
Ich habe versucht, so weit, mit zwei aufeinanderfolgenden serialQueue.sync{}
Warteschlangen. Aber ich musste erkennen, dass der Code nicht in der Reihenfolge funktioniert, die ich möchte.
Der Druck-Anweisung im Protokoll entpuppen sich wie folgt zusammen:
Hmmmmmm 2
Hmmmmmm 1
Hmmmmmm 3
(anstelle von 1, 2, 3 je nach Bedarf)!
Wie erhalten Sie die Bestellung 1, 2, 3 ??
(dh wie kann man die httpBody des zweiten dataTask stellen Sie sicher, von der ersten dataTask mit einem Ergebnis kommen gefüllt werden?)
Hier ist mein Code: (nicht ausführbare Datei als URL wurden herausgenommen - aber Sie bekommen den Punkt)!
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.
}
}
Irgendwelche Hilfe geschätzt!
lustig - Ich möchte das gleiche wissen, 19 Stunden später! :) – Fattie
Sie haben Recht, URLSession.shared.dataTask scheint aus serialQueue springen. – Fattie
Eine andere Möglichkeit, dies zu tun, ist mit einer Operationswarteschlange, die entweder (a) "maxConcurrentOperationCount" von "1" hat; oder (b) für die Sie Abhängigkeiten zwischen den Operationen herstellen. Damit dies funktioniert, müssen Sie eine asynchrone Unterklasse "Operation"/"NSOperation" erstellen, die Sie unter http://stackoverflow.com/questions/32322386/how-to-download-multiple-files-sequentially-using-nsurlsession- Downloadtask-in-s/32322851 # 32322851. – Rob