GCD总结

一.队列:这里的队列指执行任务的等待队列,即用来存放任务的队列。


截屏2019-11-25下午3.33.07.png

二.在队列中加入任务
1.队列中 添加 异步调用的任务,并执行:


WeChatb25754c387545517b9850be5214b22b6.png

2.队列中 添加 同步调用的任务,并执行:


WeChat85ae90e50299d48e899b68085ab1f637.png

三、注意: 并发队列不具备开启新线程能力,异步调用任务具备开启新线程功能,
所以并发队列中添加同步执行多个任务时也只能依次执行

四、GCD其他方法
1.GCD栅栏:dispatch_barrier_async
我们有时需要异步执行两组操作,而且第一组操作执行完之后,才能开始执行第二组操作。这样我们就需要一个相当于 栅栏 一样的一个方法将两组异步执行的操作组给分割起来,当然这里的操作组里可以包含一个或多个任务。


WeChat5cd70c31f784940a9e49b6459109d638.png

2.GCD延时执行:dispatch_after
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// 2.0 秒后异步追加任务代码到主队列,并开始执
});

3.GCD 一次性代码(只执行一次):dispatch_once


WeChat82590a98918eed2b04486d2e8fa77aa8.png
  1. GCD 队列组:dispatch_group
    有时候我们会有这样的需求:分别异步执行2个耗时任务,然后当2个耗时任务都执行完毕后再回到主线程执行任务。这时候我们可以用到 GCD 的队列组。
    .调用队列组的 dispatch_group_async 先把任务放到队列中,然后将队列放入队列组中。或者使用队列组的 dispatch_group_enter、dispatch_group_leave 组合来实现 dispatch_group_async。
    .调用队列组的 dispatch_group_notify 回到指定线程执行任务。或者使用 dispatch_group_wait 回到当前线程继续向下执行(会阻塞当前线程)。


    WeChat3eaf8971943871e3a68db7569a7b5650.png

    dispatch_group_wait:

  • 暂停当前线程(阻塞当前线程),等待指定的 group 中的任务执行完成后,才会往下继续执行。


    WeChat4fc3a226882406e38bb1de1e7bbe577e.png

5.线程锁:semaphore


WeChat1351ae3e4e6409fa08e7f11af68eba40.png

WeChatd96ae613e3e55b080e0a44ec9416eded.png

你可能感兴趣的:(GCD总结)