NSOperationQueues 是否总是在被释放之前完成他们的队列?
Do NSOperationQueues always complete their queues before being deallocated?
我的任务是清理我们项目中一些现有的 Swift 代码,这些代码刚刚转换为 Swift 3。但是,我一直看到这对我来说很可疑.
OperationQueue().addOperation(someOperation)
这是 concerns/issues 我有...
- 队列实例就在那里创建和使用。没有存储对它的引用以供其他地方使用。
- 由于上述原因,队列中只会有一个操作,那么为什么要使用队列呢?
- 既然没有人持有对队列的引用,在 ARC 下,它不应该被立即释放,如果是这样,现在正在执行的操作本身会发生什么?它是被中断、中止还是仍然完成?
无论如何,我想知道我是否遗漏了什么,或者我不知道 'feature' 的 NSOperationQueue 和 NSOperations 使这段代码有意义。谁能阐明这一点,或者您是否同意这是不好的做法?
我也见过这种模式。我认为它的工作方式类似于 NSURLConnection: NSOperationQueue "knows" 它有一个待处理的操作并且不允许自己立即消失。还要记住 NSOperationQueue 并不是真正的 "thing";它是底层调度队列的一种前端。
在没有合理位置存储对队列的引用的情况下使用此模式具有一定的意义。您可以使用它来产生强大的效果,如 this example 中操作具有依赖性,因此在所有依赖性都存在之前不会执行。
但是,就我个人而言,如果我不利用 NSOperation 这类功能,我会更倾向于直接使用 GCD。
(至于你的中间点,在主线程上执行是没有意义的,因为如果操作很长怎么办?你会阻塞主线程。但是,请注意,如果你'我想说的是 "do this after everything else",Swift 给你 defer
。)
我的任务是清理我们项目中一些现有的 Swift 代码,这些代码刚刚转换为 Swift 3。但是,我一直看到这对我来说很可疑.
OperationQueue().addOperation(someOperation)
这是 concerns/issues 我有...
- 队列实例就在那里创建和使用。没有存储对它的引用以供其他地方使用。
- 由于上述原因,队列中只会有一个操作,那么为什么要使用队列呢?
- 既然没有人持有对队列的引用,在 ARC 下,它不应该被立即释放,如果是这样,现在正在执行的操作本身会发生什么?它是被中断、中止还是仍然完成?
无论如何,我想知道我是否遗漏了什么,或者我不知道 'feature' 的 NSOperationQueue 和 NSOperations 使这段代码有意义。谁能阐明这一点,或者您是否同意这是不好的做法?
我也见过这种模式。我认为它的工作方式类似于 NSURLConnection: NSOperationQueue "knows" 它有一个待处理的操作并且不允许自己立即消失。还要记住 NSOperationQueue 并不是真正的 "thing";它是底层调度队列的一种前端。
在没有合理位置存储对队列的引用的情况下使用此模式具有一定的意义。您可以使用它来产生强大的效果,如 this example 中操作具有依赖性,因此在所有依赖性都存在之前不会执行。
但是,就我个人而言,如果我不利用 NSOperation 这类功能,我会更倾向于直接使用 GCD。
(至于你的中间点,在主线程上执行是没有意义的,因为如果操作很长怎么办?你会阻塞主线程。但是,请注意,如果你'我想说的是 "do this after everything else",Swift 给你 defer
。)