【发布时间】:2021-10-11 05:45:40
【问题描述】:
我正在尝试使用semaphore 在DispatchWorkItem 中添加异步任务列表。
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 的循环和过程?
【问题讨论】:
-
在
semaphore.wait()之后放置一条打印语句,并确保在您的addSticker函数执行完成后发出信号。 -
@Kozmotronik 它发出信号
标签: swift for-loop dispatchsemaphore dispatchworkitem