Использование XCode-8.2.1, Swift-3.0.2 и iOS-10.2.1,Как синхронизировать последовательную очередь для задач URLSession?
Я пытаюсь вызвать две разные страницы URLSession.shared.dataTasks (первый - это простой URL-запрос, а второй - POST-запрос).
Поскольку мой первый DataTask предоставляет результат, который необходим в httpBody второй DataTask, две страницы URLSession.shared.dataTasks будут запускаться последовательно, один за другим! (а также подготовительный код должен выполняться последовательно).
Я пробовал до сих пор использовать две последовательные очереди serialQueue.sync{}
. Но я должен был понять, что код не работает в том порядке, в котором я бы хотел.
Отпечаток-заявление в журнале оказывается следующим образом:
Hmmmmmm 2
Hmmmmmm 1
Hmmmmmm 3
(вместо 1, 2, 3 при необходимости)!
Как вы можете получить заказ 1, 2, 3 ??
(то есть, как вы можете убедиться, что httpBody второго dataTask может быть заполнен в результате прихода с первым 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 часов спустя! :) – Fattie
вы правы, URLSession.shared.dataTask, похоже, выпрыгивает из serialQueue. – Fattie
Другой способ сделать это - с рабочей очередью, которая либо (a) имеет 'maxConcurrentOperationCount'' 1'; или (b), для которых вы устанавливаете зависимости между операциями. Но для этого вам нужно сделать асинхронный подкласс 'Operation' /' NSOperation', a la http://stackoverflow.com/questions/32322386/how-to-download-multiple-files-sequently-using-nsurlsession- downloadtask-в-с/32322851 # 32322851. – Rob