Fork me on GitHub

iOS开发之GCD详解

队列 dispatch_queue_t

并行队列

其任务是随机顺序执行,完全由系统处理。

  • 全局并行队列
1
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
  • 自定义创建并行队列
1
dispatch_queue_create("com.idhong.concurrentQueue", DISPATCH_QUEUE_CONCURRENT);

串行队列

其任务是按照先后顺序执行

  • 全局串行队列 (主线程队列)
1
dispatch_get_main_queue();
  • 自定义创建串行队列
1
2
dispatch_queue_create("com.idhong.concurrentQueue", DISPATCH_QUEUE_SERIAL);
dispatch_queue_create("com.idhong.concurrentQueue", NULL);

队列可以理解为对任务的管理,对任务使用 串行(先后顺序执行)还是并行(随机执行,由系统确定)处理。

异步执行&同步执行

dispatch_async

默认会开启新线程执行传入的队列,会立即返回。

dispatch_sync

在当前线程执行传入的队列,执行完才返回。

1
2
dispatch_sync(dispatch_get_main_queue(), ^{
});

当前的线程在主线程中执行时会导致死锁,dispatch_sync 操作会让传如的队列在当前线程执行,而且必须执行完才返回,dispatch_get_main_queue()又是串行队列,是先进先出,(先后顺序执行)必须要让先加入 dispatch_get_main_queue() 中的任务执行完毕执行(外面的代码),从而导致相互等待导致死锁。

  • 串行队列a同步执行dispatch_sync 串行队列a 的任务会导致死锁

未完待续…

- END -
关注微信公众号,发现更多精彩

文章作者:梁大红

特别声明:若无特殊声明均为原创,转载请注明,侵权请联系

版权声明:署名-非商业性使用-禁止演绎 4.0 国际