Cocoa touch NSOperationQueue何时开始其第一个操作?
我已经创建了一个测试项目,在主项目中使用之前,我正在测试关于Cocoa touch NSOperationQueue何时开始其第一个操作?,cocoa-touch,cocoa,nsoperationqueue,Cocoa Touch,Cocoa,Nsoperationqueue,我已经创建了一个测试项目,在主项目中使用之前,我正在测试关于NSOperation和NSOperationQueue的假设 我的代码非常简单,所以我将在这里包括所有代码。这是使用命令行基础工程的弧线打开。 行动.h Main.m 写了这篇文章并尝试了一些组合之后,我发现当我像这样重新排序队列设置时: 2012-05-02 11:37:08.573 QueueTest[1574:1b03] Operation create 2012-05-02 11:37:08.584 QueueTest[157
NSOperation
和NSOperationQueue
的假设
我的代码非常简单,所以我将在这里包括所有代码。这是使用命令行基础工程的弧线打开。
行动.h
Main.m
写了这篇文章并尝试了一些组合之后,我发现当我像这样重新排序队列设置时:
2012-05-02 11:37:08.573 QueueTest[1574:1b03] Operation create
2012-05-02 11:37:08.584 QueueTest[1574:1903] Operation update2
2012-05-02 11:37:08.586 QueueTest[1574:1b03] Operation update1
[queue addOperation: update1];
[queue addOperation: create];
[queue addOperation: update2];
[update1 addDependency: create];
[update2 addDependency: create];
[queue waitUntilAllOperationsAreFinished];
我得到了同样的结果:
2012-05-02 11:38:23.965 QueueTest[1591:1b03] Operation create
2012-05-02 11:38:23.975 QueueTest[1591:1b03] Operation update1
2012-05-02 11:38:23.978 QueueTest[1591:1903] Operation update2
我应该注意到,我在一些运行中发现update2是在update1之前执行的,但这种行为并不奇怪。为什么NSOperationQueue
应该是确定性的,而我没有要求它是确定性的
我确实感到惊讶的是,create总是在update1和update2之前执行,即使在添加依赖项之前将所有内容都添加到队列中
显然,这是一件愚蠢的事情,但这让我想知道:在我向队列中添加操作和执行操作之间的延迟是有记录的,还是可以预测的?NSOperationQueue
何时开始处理添加的操作
实际上,最重要的是,NSOperationQueue到底在等待什么?等待什么时候会以某种我无法抵抗的方式咬我?进一步的实验似乎表明,只要当前线程通过
[queue WaitUntillalOperations已完成]
,[NSThread sleepForTimeInterval:0.000001]
,或中断的线程
(如果有人有更好的答案,我很乐意听到,并会接受。)
显然,这是一件愚蠢的事情,但这让我想知道:我向队列中添加操作和执行操作之间的延迟是有记录的还是可以预测的?NSOperationQueue何时开始处理添加的操作
之后:
- 将操作添加到队列中,然后
- 操作的所有依赖项都已完成,并且
- 队列没有更好的事情要做(就优先级而言)
进一步的实验似乎表明,只要当前线程通过[queue WaitUntillalOperationsDefished]、[NSThread sleepForTimeInterval:0.000001]或中断的线程将控制权交给NSOperationQueue,NSOperationQueue就会开始运行操作 这一假设是假的,原因有二:
addOperation:
甚至返回之前开始(尽管这种极端情况不太可能发生)
由于开销),更重要的是,其他操作可以在第一个操作运行时运行一旦操作启动,向其添加依赖项就没有任何效果。因为在将其添加到队列中时,可能会立即发生这种情况,因此,如果希望依赖项可靠地生效,则必须在将操作添加到队列中之前向操作添加依赖项。我怀疑这在任何方面都是可预测的或可靠的。这是一个经典做法竞争条件。我认为设置依赖项的当前线程可能有优势,因为它已经在运行,但不依赖于此。如果有任何可能,另一个线程花在做某件事情上的时间会“咬人”你,那么你做错了。谢谢Ken.:)是的,我打算在这方面比我的测试代码更小心。但我的天性之一是当我发现一些不应该工作的东西时,除了确保它应该工作之外,我还想了解它。NSOperationQueue从不同的线程运行,而不是(通常)拥有这种优势在这里是最有意义的。我想这会导致人们发现不可能的bug。
2012-05-02 11:37:08.573 QueueTest[1574:1b03] Operation create
2012-05-02 11:37:08.584 QueueTest[1574:1903] Operation update2
2012-05-02 11:37:08.586 QueueTest[1574:1b03] Operation update1
[queue addOperation: update1];
[queue addOperation: create];
[queue addOperation: update2];
[update1 addDependency: create];
[update2 addDependency: create];
[queue waitUntilAllOperationsAreFinished];
2012-05-02 11:38:23.965 QueueTest[1591:1b03] Operation create
2012-05-02 11:38:23.975 QueueTest[1591:1b03] Operation update1
2012-05-02 11:38:23.978 QueueTest[1591:1903] Operation update2