2016-11-21 22 views
0

我已经完成了一项任务,即清理刚刚转换为Swift 3的项目上的一些现有Swift代码。但是,我一直看到这看起来对我来说很可疑。NSOperationQueues在释放之前是否总是完成队列?

OperationQueue().addOperation(someOperation) 

这里有顾虑/问题,我有...

  • 创建和使用权存在的队列实例。没有参考它被存储在其他地方使用。
  • 由于上述原因,队列中只会有一个操作,所以为什么要使用队列呢?
  • 由于没有人持有对队列的引用,因此在ARC下不应该立即释放它,如果是这样,现在正在执行的操作本身会发生什么?它会被中断,中止还是仍然完成?

无论如何,我想知道如果我失去了一些东西还是我不知道NSOperationQueue和NSOperations,使这个代码是有意义的“功能”的。任何人都可以阐明这一点,或者你认为这是不好的做法吗?

回答

0

我也看过这种图案。我认为它像NSURLConnection一样工作:NSOperationQueue“知道”它有一个挂起的操作,并且不允许它立即出现。另外请记住,NSOperationQueue并不是真正的“事情”;它是底层调度队列的一种前沿。

在没有合理位置存储对队列的引用的情况下使用此模式是有一定意义的。您可以使用它来产生强大的效果,如this example中操作具有依赖关系,因此直到所有依赖项都被执行。然而,就个人而言,如果我没有充分利用NSOperation的特点,我更倾向于直接使用GCD。 (关于你的中间点,在主线程上执行是没有意义的,因为如果操作很长,你会阻塞主线程,但是请注意,如果你只是试图说是“这样做后,”斯威夫特给你defer。)

+0

关于我的观点2,我意识到错误,只要我发布它,但遇到了一个会议。现在更正它... – MarqueIV

+0

队列的目的是进入后台线程 - 正如我所说的,在正常情况下,我会直接使用GCD。但是,正如我所说,NSOperation可以让你做一些你不能单独使用GCD的事情,在这种情况下,我可能会使用像这样的模式。同样要记住,GCD是相对较新的,而NSOperation的历史要长得多,所以这种模式可能会从暗淡的过去(只是猜测)中发展而来。 – matt

相关问题