Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa touch NSOperationQueue何时开始其第一个操作?_Cocoa Touch_Cocoa_Nsoperationqueue - Fatal编程技术网

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就会开始运行操作

这一假设是假的,原因有二:

  • 抢占式多任务处理是在任何版本的OSX上(以及所有版本的iOS上)都可以完成的,这意味着调度程序可以随时中断你的线程。你不需要放弃控制就可以失去控制
  • 每个当前的OS X和iOS设备都有多个内核,这意味着操作可以在
    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