我正在运行一个无限循环来在dispatchQueue.global()。异步任务中振动我的手机,所以我的UI不会被冻结,但问题是我无法阻止它。下面是我的代码
var queue: DispatchWorkItem?
queue = DispatchWorkItem {
while (self.l > 1)
{
AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))
}
}
DispatchQueue.global().async(execute: queue!)
以下是我试图在用户离开屏幕时停止它的代码
override func viewWillDisappear(_ animated: Bool) {
queue?.cancel()
l=0
DispatchQueue.global().async {
self.queue?.cancel()
}
print("view will disapear")
}
几乎尝试了一切,但仍未能阻止全球调度任务。 PS:我是iOS开发新手:)
问题已经解决,实际上不应该首先使用调度全局异步。尝试用计时器做它并且它工作,在每秒后振动并且它不会冻结UI,在调用timer.invalidate()之后也很容易停止。谢谢你的帮助:)
GCD
(Grand Central Dispatch)队列无法阻止。如果你想停止异步队列,那么你必须使用NSOperationQueue
,它有pause
,resume
,cancel
队列中的任务选项。
从您的代码中,您可以尝试再做一件事来阻止它,因为您正在使用无限循环来振动。在循环中,您可以添加一些条件,以免进一步振动。
实际上var queue: DispatchWorkItem?
是一个DispatchWorkItem
,如果还没有执行就可以取消。因此,如果你确保在DispatchQueue.global().async(execute: queue!)
之后调用viewWillDisappear
,你的代码应该按预期工作。