使用GCD的FIFO串行队列

时间:2013-01-02 20:34:14

标签: objective-c objective-c-blocks grand-central-dispatch fifo

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

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

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

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

  • 使用dispatch_async时,那就是当主要线程上的块没有执行时。

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

  • 在调用dispatch_async时,两个块似乎运行正常且离开主线程的唯一时间。

然而,我之所以选择GCD和同步方法,以至于我的印象是我正在创建一个新队列(因而是一个新线程),并且在该队列中添加块只会阻塞一个,直到另一个拥有完成执行。是不是这种情况,或者创建队列并不能保证代码不会在主线程上运行?

1 个答案:

答案 0 :(得分:59)

这是GCD中的FIFO队列:

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

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

dispatch_async(serialQueue, ^{
    //block2
});