无法在 swift 上停止 DispatchQueue.global().async 任务
Unable to stop DispatchQueue.global().async task on swift
我是 运行 在 dispatchQueue.global().async 任务中振动我的 phone 的无限循环,所以我的 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 开发新手 :)
GCD
(Grand Central Dispatch) 队列无法停止。如果要停止异步队列,则必须使用 NSOperationQueue
,它可以选择 pause
、resume
、cancel
队列中的任务。
根据您的代码,您可以再尝试一种方法来阻止它,因为您正在使用无限循环来振动。在循环中,您可以添加一些条件以不再振动。
实际上var queue: DispatchWorkItem?
是一个DispatchWorkItem
,如果还没有执行可以取消。因此,如果您确保 DispatchQueue.global().async(execute: queue!)
在 viewWillDisappear
之后调用,您的代码应该按预期工作。
问题已经解决,实际上不应该首先使用 dispatch global async。尝试用定时器来做,它起作用了,每秒钟振动一次,它不会冻结 UI,在调用 timer.invalidate() 后也很容易停止。感谢大家的帮助:)
我是 运行 在 dispatchQueue.global().async 任务中振动我的 phone 的无限循环,所以我的 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 开发新手 :)
GCD
(Grand Central Dispatch) 队列无法停止。如果要停止异步队列,则必须使用 NSOperationQueue
,它可以选择 pause
、resume
、cancel
队列中的任务。
根据您的代码,您可以再尝试一种方法来阻止它,因为您正在使用无限循环来振动。在循环中,您可以添加一些条件以不再振动。
实际上var queue: DispatchWorkItem?
是一个DispatchWorkItem
,如果还没有执行可以取消。因此,如果您确保 DispatchQueue.global().async(execute: queue!)
在 viewWillDisappear
之后调用,您的代码应该按预期工作。
问题已经解决,实际上不应该首先使用 dispatch global async。尝试用定时器来做,它起作用了,每秒钟振动一次,它不会冻结 UI,在调用 timer.invalidate() 后也很容易停止。感谢大家的帮助:)