31

我正在尝试为我工作的公司创建一个(网络)同步阵列。虽然网络部分工作正常,但我已经陷入了一个问题。

我的愿望是使用创建一个新队列dispatch_create_queue,我将添加两个不在主线程上运行但以串行方式运行的块,这意味着首先第一个块必须运行,然后是第二个,并且永远不会在平行线。

我已经阅读了苹果文档,但至少可以说令人困惑。

  • 当我使用创建队列dispatch_queue_create然后使用添加块(在它们被定义之后)dispatch_sync时,我发现该块仍在主线程上执行。

  • 使用dispatch_async时,即块不在主线程上执行。

  • 当我尝试使用它们添加两个块时,dispatch_sync它们会被永久阻止。

  • 两个块似乎都运行良好并且脱离主线程的唯一一次是在调用dispatch_async.

然而,我之所以选择 GCD 和同步方法,是因为我的印象是我正在创建一个新队列(因此​​是一个新线程),并且向该队列添加块只会阻塞一个,直到另一个完成执行。不是这样,还是创建队列并不能保证代码不会在主线程上运行?

4

1 回答 1

63

这是 GCD 中的 FIFO 队列:

dispatch_queue_t serialQueue = dispatch_queue_create("com.blah.queue", DISPATCH_QUEUE_SERIAL);

...
dispatch_async(serialQueue, ^{
    //block1
});

dispatch_async(serialQueue, ^{
    //block2
});
于 2013-01-02T20:39:39.143 回答