Utilisation de XCode-8.2.1, Swift-3.0.2 et iOS-10.2.1,Comment synchroniser la file d'attente série pour les tâches URLSession?
J'essaie d'appeler deux URLSession.shared.dataTasks différentes (la première est une simple demande d'URL et la seconde est une requête POST).
Depuis que mon premier DataTask fournit un résultat qui est nécessaire dans le httpBody de la seconde DataTask, les deux URLSession.shared.dataTasks doivent fonctionner en série, l'une après l'autre! (et aussi le code préparatif doit courir consécutivement).
J'ai essayé, jusqu'à présent, d'utiliser deux files d'attente serialQueue.sync{}
consécutives. Mais je devais réaliser que le code ne fonctionne pas dans l'ordre que je voudrais.
La-déclaration d'impression dans le tour journal révèle être comme suit:
Hmmmmmm 2
Hmmmmmm 1
Hmmmmmm 3
(au lieu de 1, 2, 3 au besoin)!
Comment pouvez-vous obtenir l'ordre 1, 2, 3?
(à savoir, comment pouvez-vous vous assurer que le httpBody du second dataTask peut être rempli d'un résultat provenant de la première dataTask?)
Voici mon code: (non exécutable comme URL ont été prises en - mais vous avez compris)!
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.
}
}
Toute aide appréciée!
drôle - Je veux savoir la même chose 19 heures plus tard! :) – Fattie
vous avez raison, URLSession.shared.dataTask semble sortir de serialQueue. – Fattie
Une autre façon de procéder est avec une file d'attente d'opération qui (a) a 'maxConcurrentOperationCount' de' 1'; ou (b) pour lequel vous établissez des dépendances entre les opérations. Mais pour que cela fonctionne, vous devez faire une sous-classe asynchrone 'Operation' /' NSOperation', à la http://stackoverflow.com/questions/32322386/how-to-download-multiple-files-sequentially-using-nsurlsession- downloadtask-in-s/32322851 # 32322851. – Rob