Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.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/8/swift/18.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 停止任意函数执行_Ios_Swift_Multithreading_Swift4_Grand Central Dispatch - Fatal编程技术网

Ios 停止任意函数执行

Ios 停止任意函数执行,ios,swift,multithreading,swift4,grand-central-dispatch,Ios,Swift,Multithreading,Swift4,Grand Central Dispatch,出于这个问题的目的,假设我需要在某个对象上运行某个函数,并且该函数需要很长时间才能执行(分钟)。还假设我无法控制此函数(*)现在如何取消此函数的执行? 我想在后台线程中运行它以保持主线程空闲,我可以使用GCD、NSOperation或NSThread来实现这一点。然而,据我所知,这些支持都没有强迫停止。它们都可以被取消,但是这种取消必须在函数本身中实现——但是我没有访问该函数的权限,所以我不能这样做。我得到的最接近的方法是使用NSThread和exit(),但不幸的是,它不能应用于实例变量(参见

出于这个问题的目的,假设我需要在某个对象上运行某个函数,并且该函数需要很长时间才能执行(分钟)。还假设我无法控制此函数(*)现在如何取消此函数的执行?

我想在后台线程中运行它以保持主线程空闲,我可以使用GCD、
NSOperation
NSThread
来实现这一点。然而,据我所知,这些支持都没有强迫停止。它们都可以被取消,但是这种取消必须在函数本身中实现——但是我没有访问该函数的权限,所以我不能这样做。我得到的最接近的方法是使用
NSThread
exit()
,但不幸的是,它不能应用于实例变量(参见代码示例)。我当前的计划是尝试发送一个通知,并在对象/函数中观察它,然后使用
thread.exit()
从内部终止线程。我想知道是否有一个“更干净”或更简单的方式,无论是内置或第三方

let someObject = Object()

// Using GCD
dispatchQueue.async { someObject.expensiveFunction() }

// Using NSOperation
operationQueue.addOperation { someObject.expensiveFunction() }

// Using NSThread
let thread = Thread { someObject.expensiveFunction() }
thread.exit() // exit is not available on an instance

(*)在这种情况下,我确实可以控制函数并可以实现实际的取消,但由于我使用的库,这将需要大量重构。

您可以检查您的操作
是否在其
main()
中定期取消
,然后您可以使用
myOperation.cancel()停止它
。同样适用于
DispatchWorkItem
btw。从线程外部终止线程本质上是不安全的。它可能在调用系统库的过程中,它使用进程中的其他线程共享的状态或资源。如果一个线程被不规则地终止,它可能会使该状态处于不一致的状态,从而影响其他线程。例如,如果
malloc()。如果您必须这样做,可能一个单独的进程(可能是XPC服务)是最好的。@Kenthomass这似乎限制了我的选择,但我想我只是避免了一些奇怪的崩溃带来的头痛-谢谢!