我有一些我想异步做的任务。所以我在一个类中创建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)
}
}
}
或者还有其他更好的方法或机制吗?
答案 0 :(得分:1)
阅读Apple`s GCD documentation,您可以看到以下内容:
在完成呼叫时运行的任何阻止后,将发生暂停。
这意味着,每个块都将被执行,已经启动了。只需在LoginSuccessFull
函数中创建第二个块,例如:
anotherQueue.async {
print("this is the second block")
}
如果在函数调用后直接挂起,则不会执行该块。
如果您希望cancel
立即执行GCD
中的操作,则必须编写自己的实现。但对于how来说,GCD
始终是一个问题,因为它不是designed那样。
另一种选择是使用NSOperationQueue
,但是您已经实现了cancel
子类的NSOperation
逻辑。