Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在swift执行期间停止GCD_Ios_Swift_Grand Central Dispatch - Fatal编程技术网

Ios 如何在swift执行期间停止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

我使用GCD执行后台执行。但是在我的ViewController类中有一个按钮。用户单击按钮后,如何在执行之间停止GCD? 这是我的密码

 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_异步块调用