无法在 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,它可以选择 pauseresumecancel 队列中的任务。

根据您的代码,您可以再尝试一种方法来阻止它,因为您正在使用无限循环来振动。在循环中,您可以添加一些条件以不再振动。

实际上var queue: DispatchWorkItem?是一个DispatchWorkItem,如果还没有执行可以取消。因此,如果您确保 DispatchQueue.global().async(execute: queue!)viewWillDisappear 之后调用,您的代码应该按预期工作。

问题已经解决,实际上不应该首先使用 dispatch global async。尝试用定时器来做,它起作用了,每秒钟振动一次,它不会冻结 UI,在调用 timer.invalidate() 后也很容易停止。感谢大家的帮助:)