在swift 3中使用NotificationCenter停止Dispatchqueue

时间:2017-01-11 11:10:05

标签: ios swift3 dispatch-async

我有一些我想异步做的任务。所以我在一个类中创建dispatchqueue并完成一些任务。

//Adding Observer      
NotificationCenter.default.addObserver(forName: NSNotification.Name(rawValue: "NotificationIdentifier"), object: nil, queue: nil, using:catchNotification).

//Creating Background Thread.
     let anotherQueue = DispatchQueue(label: "Thread1", qos: .background)

    //Asynch thread.
    anotherQueue.async {
        for i in 0..<50 {
       print("\n ",i)
            sleep(1)
        }
    }

但是在某些事件上我想停止这个,我正在处理这样的事情。

func catchNotification (notification:Notification) -> Void {
    //Stop the queue.
    anotherQueue.suspend()
}

我发布了一些其他类的通知。收到通知。但是线程没有被暂停。

如果你想参考,这是完整的课程。

LoginPresenter.swift

let anotherQueue = DispatchQueue(label: "Thread1", qos: .background)
class LoginPresenter : LoginInteractor {
func catchNotification (notification:Notification) -> Void {
    //Stop the queue.
    anotherQueue.suspend()
}

func LoginSuccessFull()
{   
    NotificationCenter.default.addObserver(forName: NSNotification.Name(rawValue: "NotificationIdentifier"), object: nil, queue: nil, using:catchNotification)

    //Asynch thread.
    anotherQueue.async {
        //Synch
        for i in 0..<50 {
       print("\n ",i)
            sleep(1)
        }
    }
}

或者还有其他更好的方法或机制吗?

1 个答案:

答案 0 :(得分:1)

阅读Apple`s GCD documentation,您可以看到以下内容:

  

在完成呼叫时运行的任何阻止后,将发生暂停。

这意味着,每个块都将被执行,已经启动了。只需在LoginSuccessFull函数中创建第二个块,例如:

anotherQueue.async {
  print("this is the second block")
}

如果在函数调用后直接挂起,则不会执行该块。

如果您希望cancel立即执行GCD中的操作,则必须编写自己的实现。但对于how来说,GCD始终是一个问题,因为它不是designed那样。

另一种选择是使用NSOperationQueue,但是您已经实现了cancel子类的NSOperation逻辑。