我正在运行无限循环以使我的电话在dispatchQueue.global()。async任务中振动,因此我的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开发的新手:)
答案 0 :(得分:0)
GCD
(大中央调度)队列无法停止。如果要停止异步队列,则必须使用NSOperationQueue
,该选项可以选择pause
,resume
,cancel
队列中的任务。
由于您正在使用无限循环进行振动,因此您可以从代码中尝试另一件事来停止它。在这里,您可以添加一些条件以免进一步振动。
答案 1 :(得分:0)
实际上,var queue: DispatchWorkItem?
是DispatchWorkItem
,如果尚未执行,则可以取消。因此,如果您确定在DispatchQueue.global().async(execute: queue!)
之后进行viewWillDisappear
调用,您的代码应该可以按预期工作。
答案 2 :(得分:0)
问题已解决,实际上首先不应该使用调度全局异步。尝试使用计时器来执行此操作,并且它可以工作,每秒钟振动一次,并且不会冻结UI,在调用timer.invalidate()之后也很容易停止。感谢您的帮助:)