迅速停止DispatchQueue.global()。async任务

时间:2019-03-04 11:47:44

标签: ios swift xcode dispatch-async

我正在运行无限循环以使我的电话在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开发的新手:)

3 个答案:

答案 0 :(得分:0)

GCD(大中央调度)队列无法停止。如果要停止异步队列,则必须使用NSOperationQueue,该选项可以选择pauseresumecancel队列中的任务。

由于您正在使用无限循环进行振动,因此您可以从代码中尝试另一件事来停止它。在这里,您可以添加一些条件以免进一步振动。

答案 1 :(得分:0)

实际上,var queue: DispatchWorkItem?DispatchWorkItem,如果尚未执行,则可以取消。因此,如果您确定在DispatchQueue.global().async(execute: queue!)之后进行viewWillDisappear调用,您的代码应该可以按预期工作。

答案 2 :(得分:0)

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