GCD那些事

一. GCD的介绍

GCD属于系统级的线程管理,在Dispatch queue中执行需要执行的任务性能非常的高。GCD这块已经开源,地址:http://libdispatch.macosforge.org。GCD中的FIFO队列称为dispatch queue,用来保证先进来的任务先得到执行。这里我们从作用和场景同时分析,看一下到底在哪些地方会使用。单单只介绍作用的话,可能

二. 常用的GCD

1. dispatch_semaphore_t,dispatch_semaphore_wait,dispatch_semaphore_signal

作用:

在多线程下控制多线程的并发数目。

  1. 创建信号量,可以设置信号量的资源数。0表示没有资源,调用dispatch_semaphore_wait会立即等待。
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
  2. 等待信号,可以设置超时参数。该函数返回0表示得到通知,非0表示超时。dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
  3. 通知信号,如果等待线程被唤醒则返回非0,否则返回0。
    dispatch_semaphore_signal(semaphore);
使用场景一:并发队列

比如现在我每次想执行10个任务。休息两秒。继续执行10个任务。可以这么写.

使用场景二:异步队列中做事,等待回调后执行某件事

执行结果:

使用场景三:生产者,消费者

执行结果:

2. dispatch_group_t,dispatch_group_notify

用来阻塞一个线程,直到一个或多个任务完成执行。有时候你必须等待任务完成的结果,然后才能继续后面的处理

使用场景一:并发队列

等价于:

使用场景二:多任务执行完成,刷新UI

需要在主线程中执行,比如操作GUI,那么我们只要将main queue而非全局队列传给dispatch_group_notify函数就行了。

执行结果:

3. dispatch_apply

是同步函数,会阻塞当前线程直到所有循环迭代执行完成。当提交到并发queue时,循环迭代的执行顺序是不确定的

执行结果:

4. dispatch_source_set_timer,dispatch_suspend,dispatch_resume,dispatch_source_cancel

众所周知,定时器有NSTimer,但是NSTimer有如下弊端:

  1. 必须保证有一个活跃的runloop,子线程的runloop是默认关闭的。这时如果不手动激活runloop,performSelector和scheduledTimerWithTimeInterval的调用将是无效的
  2. NSTimer的创建与撤销必须在同一个线程操作、performSelector的创建与撤销必须在同一个线程操作。
  3. 内存管理有潜在泄露的风险

如果此时不调用

是无法停止的。还有持有self,造成对象无法释放。
所以在此我还是比较推荐用dispatch的timer,无须考虑这些事情

5. dispatch_barrier_async

这里之前的文章有非常详细的解释以及demo在文章后面。可以参考 iOS异步读写总结之NSDictionary,这里就不去详细说明了。 注意一下DISPATCH_QUEUE_CONCURRENT(并行队列)和DISPATCH_QUEUE_SERIAL(串行队列)即可

6. dispatch_syncdispatch_async

这里一个是同步,一个是异步。只要注意一下死锁的问题就好了。

错误场景1: (死锁)结果无法输出(调用场景限于主线程调用主线程)

原因:
1:dispatch_sync在等待block语句执行完成,而block语句需要在主线程里执行,所以dispatch_sync如果在主线程调用就会造成死锁
2:dispatch_sync是同步的,本身就会阻塞当前线程,也即主线程。而又往主线程里塞进去一个block,所以就会发生死锁。

错误场景2: (死锁)

7. dispatch_get_global_queue

全局并发队列的优先级

注意:
在实际修改bug的时候发现,global全局队列并不会反复创建新的线程,在系统启动后底层会维护一个线程池的概念,一旦用Global的队列结束,会缓存一段时间。因为在测试的时候可以打印出Thread ID。在多线程情况下发现一些ThreadID是一样的,由此得出结论。

8. dispatch_once

9. dispatch_after

三. 总结

这里是对GCD做总结的同时,突出了一些使用场景。因为在开发过程中,我们不仅仅知道这东西是啥,更要知道什么时候灵活运用,这里提供了一些解决思路。关于Block相关的方法可以参考Block那些事.最后欢迎加入QQ群:237305299。一起探讨iOS技术问题。

四. Demo下载

Demo

五. 参考链接

  1. 关于dispatch_semaphore的使用
  2. iOS多线程中的dispatch_semaphore_t semaphore(dispatch组和信号量。)
  3. Wait until multiple networking requests have all executed – including their completion blocks
  4. 选择 GCD 还是 NSTimer ?
  5. 深入理解dispatch_sync
1 4 收藏 评论

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部