全局队列
全局队列因为是全局的,不能够创建,也不需要管理内存(retain,release会被忽略)
可以通过如下代码去获取:
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
每个程序提供4种全局队列,通过优先级加以区别,分别是:HIGH, DEFAULT, LOW, BACKGROUND
串行与并行队列
串行队列会通过加入队列的顺序执行,并行则是同时执行。
主队列和全局队列也是串行队列,除此之外,还可以自定义。
在串行队列中同步执行该队列会产生死锁。
可以通过如下代码去创建队列:
dispatch_queue_create("队列名", 队列类型);
串行:DISPATCH_QUEUE_SERIAL或者NULL(默认串行)
并行:DISPATCH_QUEUE_CONCURRENT
设置上下文
可以一个队列绑定自定义的数据,在用的时候再取出来使用。
通过dispatch_set_context去实现绑定
通过dispatch_get_context去获取绑定的数据
其中context是一个void型指针
通过设置dispatch_set_finalizer_f,可以在队列结束以后去删除数据
ARC中使用__bridge_retained可以将对象转换手动管理内存,防止绑定的数据被提前释放,然后通过CFRelease去释放数据
同步和异步
同步执行会阻塞当前队列,直到任务执行完,异步执行则不会。
同步执行方法,dispatch_sync块,dispatch_sync_f函数。
异步执行方法,dispatch_async块,dispatch_async_f函数。
异步执行主队列,是跳出异步队列回到主线程。
暂停和回复队列
dispatch_suspend和dispatch_resume可以暂停和恢复队列。
队列中正在执行的函数不会被暂停。
循环
dispatch_apply可以并发执行一个for循环,进行平行运算,然后等待所有运算结束。
可以将它加入异步线程执行,执行完再返回主线程。
套嵌使用它,会产生死锁。
信号量和并发控制
dispatch_semaphore_create去创建一个信号量
dispatch_semaphore_signal去增加1个信号
dispatch_semaphore_wait会减少一个信号,当信号为0的时候会阻塞线程等待信号或者timeout
可以用semephore去实现并发控制
timeout是一个dispatch_time_t
比如创建一个1秒的延迟:dispatch_time(DISPATCH_TIME_NOW, 1*NSEC_PER_SEC);
NSEC_PER_SEC等于1000*1000*1000
分组
分组可以实现阻塞线程,直到组内所有队列都完成以后再执行新的队列。
创建分组dispatch_group_create()
异步执行分组任务dispatch_group_async
可以通过dispatch_group_wait去设置timeout
dispatch_group_notify监听分组内的队列全部完成,然后执行新的队列。
栏栅
dispatch_barrier_async会在执行完所有的之前加入的队列以后,再执行。
例如set和get方法使用栏栅可以避免数据竞争,达到并发读取,读取完在写入,比串行写和读效率高,更比同步锁效率高。
延时队列
dispatch_after可以将任务延时加入队列。
它只是延时提交block,不是很精准。