IOS的GCD基本用法

全局队列

全局队列因为是全局的,不能够创建,也不需要管理内存(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,不是很精准。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值