【发布时间】:2019-07-18 15:47:24
【问题描述】:
我有一个运行很长时间的进程,我希望能够中断它。
func longProcess (shouldAbort: @escaping ()->Bool) {
// Runs a long loop and periodically checks shouldAbort(),
// returning early if shouldAbort() returns true
}
这是我的班级使用它:
class Example {
private var abortFlag: NSObject? = .init()
private var dispatchQueue: DispatchQueue = .init(label: "Example")
func startProcess () {
let shouldAbort: ()->Bool = { [weak abortFlag] in
return abortFlag == nil
}
dispatchQueue.async {
longProcess(shouldAbort: shouldAbort)
}
}
func abortProcess () {
self.abortFlag = nil
}
}
shouldAbort 闭包捕获对abortFlag 的weak 引用,并检查该引用是指向nil 还是指向NSObject。由于引用是weak,如果原来的NSObject 被释放,那么闭包捕获的引用将突然变为nil,闭包将开始返回true。闭包将在 longProcess 函数期间重复调用,这发生在私有 dispatchQueue 上。 Example 类的 abortProcess 方法将从其他队列外部调用。如果有人调用abortProcess(),从而释放abortFlag,同时longProcess 正试图执行检查以查看abortFlag 是否已被释放呢?检查myWeakReference == nil 是线程安全操作吗?
【问题讨论】:
-
你为什么首先使用这个虚拟的
NSObject实例?看起来布尔值也一样。 -
忽略我的回答。这实际上是正确的(也很有趣),但 Rob 的建议更好。只是不要这样做。
-
我同意 Rob 的建议是可行的方法,这就是我支持它的原因,但我的问题只是部分出于需求,另一部分是好奇心。你直接回答了我的问题,所以你的答案是正确的。我很高兴阅读了 Rob 的答案,并且它作为这篇文章的一部分存在供其他人阅读
标签: swift queue thread-safety weak-references abort