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