首页 > 解决方案 > 无法用信号量打破循环

问题描述

我正在尝试在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我按下后退按钮时的循环和过程?

标签: swiftfor-loopdispatchsemaphoredispatchworkitem

解决方案


从主线程取消它

DispatchQueue.main.async {
   workItem?.cancel()
   workItem = nil
}

推荐阅读