dispatch_sync
- 同步执行,直到执行的任务完成才返回
- 目标队列:串行队列
在当前线程执行任务,顺序执行 - 目标队列:并发队列
新建线程执行任务,顺序执行 - 目标队列:主线程队列
在主线程执行任务,顺序执行 - 在当前线程调用且目标队列为当前队列时,形成死锁
- 相应的block不会被copy
- 目标队列不会被系统retain
- 在尽可能的情况下,block将被优化运行在当前线程。
dispatch_barrier_sync
- 同步执行,直到执行的任务完成才返回
- 目标队列:串行队列
在当前线程执行任务,顺序执行 - 目标队列:并发队列
在当前线程执行任务,顺序执行 - 目标队列:主线程队列
在主线程执行任务,顺序执行 - 在当前线程调用且目标队列为当前队列时,形成死锁
- 相应的block不会被copy
- 目标队列不会被系统retain
- 在尽可能的情况下,barrier block将被优化运行在当前线程。
- 当barrier block到达自定义并发队列的顶部,它不会立刻执行,相反需要等到当前执行block完成,然后barrier block自动运行。在barrier block之后的block必须等到barrier block执行完毕才执行,形成一个栅栏。
因此可以用来等待多个block任务完成的时机。 - 必须由
dispatch_queue_create
创建自定义的并发队列。如果不是由该函数创建的并发队列,而是串行队列(主队列)或全局并发队列,其行为等同dispatch_sync
,失去栅栏的作用。
dispatch_async
- 相应的block会被copy
- 目标队列被系统retain直到block执行完毕
dispatch_barrier_async
相应的block会被copy
目标队列被系统retain直到block执行完毕
当barrier block到达自定义并发队列的顶部,它不会立刻执行,相反需要等到当前执行block完成,然后barrier block自动运行。在barrier block之后的block必须等到barrier block执行完毕才执行,形成一个栅栏。
因此可以用来等待多个block任务完成的时机。必须由
dispatch_queue_create
创建自定义的并发队列。如果不是由该函数创建的并发队列,而是串行队列(主队列)或全局并发队列,其行为等同dispatch_async
,失去栅栏的作用。
dispatch_group_async
发送一个block任务到派发队列并且关联到一个派发group
- 异步调用,立刻返回
- group将被系统retain直到block执行完毕
- queue将被系统retain直到block执行完毕
- block将被copy到堆上
- 采用dispatch_group_notify可以用来等待一组block任务执行完毕。
dispatch_group_notify
将一个block对象计划到派发队列,当所有已经提交的block任务对象执行完毕后执行该block。
- 用来实现一系列任务的完成通知功能。
- 如果group为nil,该block将直接运行
- group可以通过dispatch_release释放或者继续被重用。
- DispatchGroup对象也可以实现相同功能。