Swift 3 - 如何创建一个等待关闭完成以继续执行工作项的串行队列

时间:2016-11-09 15:07:51

标签: ios swift queue grand-central-dispatch dispatch

我正在尝试获得一个串行执行的队列,其排队的项目是同步或异步的。

这个想法是其中一个函数返回一个块。该块应该以某种方式排队到串行队列并在执行时出列,以便让后续工作项通过。这是我想要实现的一个例子:

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
}

这可能吗?

0 个答案:

没有答案