class SomeViewController: UIViewController {
let semaphore = DispatchSemaphore(value: 1)
deinit {
semaphore.signal() // just in case?
}
func someLongAsyncTask() {
semaphore.wait()
...
semaphore.signal() // called much later
}
}
如果我告诉信号量等待,然后在信号量被告知发出信号之前取消初始化拥有它的视图控制器,则应用程序会因Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
错误而崩溃。但是,如果我只是调用视图控制器semaphore.signal()
的deinit
方法,就可以避免灾难。但是,如果 async 函数在deinit
被调用之前返回并且视图控制器被取消初始化,那么signal()
就会被调用两次,这似乎没有问题。但是这样做是否安全和/或明智?