0

我正在尝试在DispatchWorkItemusing中添加异步任务列表semaphore

 func performStickerWorkItems(_ stickers: [String]) {
    let queue = DispatchQueue.global(qos: .background)
    workItem = DispatchWorkItem { [weak self] in
        for sticker in stickers {
            guard let item = self?.workItem, !item.isCancelled else {
                print("cancelled")
                break
            }
            let semaphore = DispatchSemaphore(value: 0)
            self?.addSticker(sticker: sticker) {
                print("S: \(sticker)")
                semaphore.signal()
            }
            semaphore.wait()
        }
        
        self?.workItem = nil
    }
    
    queue.async(execute: workItem!)
    workItem?.notify(queue: .main) {
        self.updateButton(false)
    }
}

如果我回去,我希望它打破循环和过程。为此,我使用该cancel方法取消DispatchWorkItem但它不会中断循环。

@IBAction func backWasPressed(_ sender: Any) {
    workItem?.cancel()
    navigationController?.popViewController(animated: true)
}

有什么解决方案可以打破semaphore我按下后退按钮时的循环和过程?

4

2 回答 2

0

从主线程取消它

DispatchQueue.main.async {
   workItem?.cancel()
   workItem = nil
}
于 2021-10-11T06:16:12.373 回答
0

DispatchWorkItem文档中说:

取消不会影响已经开始的工作项的执行。

由于您的工作项已经开始执行,您需要找到另一种解决方法来取消该工作。您也可以使用单独的线程,因为它符合您的需要,因为它确实具有有效的取消支持。

于 2021-10-11T06:40:43.753 回答