无法在swift上停止DispatchQueue.global()。异步任务

问题描述 投票:0回答:3

我正在运行一个无限循环来在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开发新手:)

ios swift xcode dispatch-async
3个回答
2
投票

问题已经解决,实际上不应该首先使用调度全局异步。尝试用计时器做它并且它工作,在每秒后振动并且它不会冻结UI,在调用timer.invalidate()之后也很容易停止。谢谢你的帮助:)


1
投票

GCD(Grand Central Dispatch)队列无法阻止。如果你想停止异步队列,那么你必须使用NSOperationQueue,它有pauseresumecancel队列中的任务选项。

从您的代码中,您可以尝试再做一件事来阻止它,因为您正在使用无限循环来振动。在循环中,您可以添加一些条件,以免进一步振动。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.