我正在尝试获得一个串行执行的队列,其排队的项目是同步或异步的。
这个想法是其中一个函数返回一个块。该块应该以某种方式排队到串行队列并在执行时出列,以便让后续工作项通过。这是我想要实现的一个例子:
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
}
这可能吗?