使用GCD的FIFO串行队列

Æle*_*lex 29 objective-c fifo grand-central-dispatch objective-c-blocks

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

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

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

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

  • 使用时dispatch_async,即当主线程上没有执行块时.

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

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

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

Fer*_*zon 60

这是GCD中的FIFO队列:

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

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

dispatch_async(serialQueue, ^{
    //block2
});
Run Code Online (Sandbox Code Playgroud)

  • dispatch_async使得调度调用本身不会阻塞,直到块完成.如果使用dispatch_sync,则任务本身将在队列所在的任何线程中执行,但您将阻止当前线程,直到任务完成.我认为这不是你所需要的. (5认同)
  • @PruitIgoe FIFO并不意味着FIFC(首先完成第一个).就像我上面提到的,FIFO顺序只是保证任务按照它们被添加到队列的顺序启动.这并不意味着他们按照相同的顺序完成,正如你给出的例子所证明的那样. (4认同)
  • 所有调度队列都是FIFO。这意味着,只要您重用相同的队列,就可以确定块执行的顺序,并保证不锁定,因此是线程安全的。 (3认同)