Я пытаюсь получить очередь, которая выполняется последовательно, независимо от того, являются ли ее элементы в очереди синхронными или асинхронными.
Идея в том, что одна из функций возвращает блок. Этот блок должен быть каким-то образом помещен в последовательную очередь и удален из очереди при выполнении, чтобы пропустить последующие рабочие элементы. Вот пример того, чего я пытаюсь достичь:
let serialQueue = DispatchQueue(label: "print.serial.queue")
var i = 0
override func viewDidLoad() {
super.viewDidLoad()
printSomething() // Executes immediately
printSomething() // Executes immediately
let completion = printSomethingWithClosure() // Will execute when the closure is called
printSomething() // Queued because completion hasn't been called yet
printSomething() // Queued because completion hasn't been called yet
completion() // The closure is executed, the queue can move on to the next work item
// Expected output:
// serial 1
// serial 2
// serial 3 (closure called)
// serial 4
// serial 5
}
func printSomething(){
let workItem = DispatchWorkItem(qos: .userInitiated, flags: .assignCurrentContext) {[unowned self] in
print("serial \(self.i)")
self.i = self.i + 1
}
serialQueue.sync(execute: workItem)
}
func printSomethingWithClosure() -> (() -> ()){
let completionHandler = {
print("serial \(self.i) (closure called)")
self.i = self.i + 1
}
// How do I queue this onto the DispatchQueue so it gets executed when the completionHandler is called?
return completionHandler
}
Это возможно?
NSOperation
. В Swift 3 кажется, что мы не можем создать подклассOperation
(NSOperation
). Итак, я не уверен, как мы можем сделать это в Swift 3. Вы нашли какое-либо решение для этого? - person KrishnaCA   schedule 02.12.2016