Ios 如何在swift执行期间停止GCD
我使用GCD执行后台执行。但是在我的ViewController类中有一个按钮。用户单击按钮后,如何在执行之间停止GCD? 这是我的密码Ios 如何在swift执行期间停止GCD,ios,swift,grand-central-dispatch,Ios,Swift,Grand Central Dispatch,我使用GCD执行后台执行。但是在我的ViewController类中有一个按钮。用户单击按钮后,如何在执行之间停止GCD? 这是我的密码 dispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_BACKGROUND.value), 0), { self.StartProcess() }) @IBAction func buttonIsCli
dispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_BACKGROUND.value), 0), {
self.StartProcess()
})
@IBAction func buttonIsClicked(sender: AnyObject) {
// how to stop GCD execution?
}
创建NSThread数组并取消最后一个元素
var threads = [NSThread]()
dispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_BACKGROUND.value), 0), {
self.StartProcess()
threads.append(NSThread.currentThread())
})
@IBAction func buttonIsClicked(sender: AnyObject) {
threads.last.cancel()
}
创建NSThread数组并取消最后一个元素
var threads = [NSThread]()
dispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_BACKGROUND.value), 0), {
self.StartProcess()
threads.append(NSThread.currentThread())
})
@IBAction func buttonIsClicked(sender: AnyObject) {
threads.last.cancel()
}
停止计时器,点击后台执行按钮
timer.invalidate()
然后通过定时器调用这个方法
var timer = NSTimer(timeInterval: 1.0, target: self, selector: "someBackgroundTask:", userInfo: nil, repeats: true)
@IBAction func buttonIsClicked(sender: AnyObject) {
timer.invalidate()
}
停止计时器,点击后台执行按钮
timer.invalidate()
然后通过定时器调用这个方法
var timer = NSTimer(timeInterval: 1.0, target: self, selector: "someBackgroundTask:", userInfo: nil, repeats: true)
@IBAction func buttonIsClicked(sender: AnyObject) {
timer.invalidate()
}
您需要一个变量来从IBAction与后台线程通信,它应该停止。后台线程必须定期查询变量。无论使用何种方法分派,都无法(安全地)强制取消飞行中的操作。在Swift和Objective-C中都是如此(更一般地说,在任何非垃圾收集的运行时中也是如此)。您必须制定一种方法,通知机上操作人员飞机应该清理,并尽早返回。这已经在其他问题中多次提到,包括(由我提出)此处:和此处:感谢您的解释和引用您需要一个变量来从iAction到后台线程进行通信,它应该停止。后台线程必须定期查询变量。无论使用何种方法分派,都无法(安全地)强制取消飞行中的操作。在Swift和Objective-C中都是如此(更一般地说,在任何非垃圾收集的运行时中也是如此)。您必须制定一种方法,通知机上操作人员飞机应该清理,并尽早返回。这一点在其他问题中已经讨论过很多次,包括(由我提出的)这里:和这里:谢谢你的解释和参考。这非常复杂,为什么不在变量设置为停止时停止处理呢?这实际上不会停止执行。它只是将线程标记为已取消。在该线程中运行的代码必须显式检查线程是否已被取消并提前退出。仅仅调用
cancel
实际上什么都不做。请参阅文档:这非常复杂,如果变量设置为stop,为什么不停止处理呢?这实际上不会停止执行。它只是将线程标记为已取消。在该线程中运行的代码必须显式检查线程是否已被取消并提前退出。仅仅调用cancel
实际上什么都不做。请参阅文档:我没有将此方法用作来自viewDidLoad()finction的dispatch_异步块调用我没有将此方法用作来自viewDidLoad()finction的dispatch_异步块调用