常见操作

1. 一次性执行

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken,^{
    NSLog(@"仅仅执行一次");
    });

2. 延迟操作

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW,(int64_t)(1.0*NSEC_PER_SEC)),dispatch_get_main_queue(),^{ NSLog(@"延迟一秒"); });//修改第二个参数可以改成纳秒级

3. 调度组-通知

1. 应用场景

先给大家说一下调度组的用例子,也就是它的应用场景:在实际开发中有的时候会需要同时监听多个异步任务最终完成的情况。例如下载小说,下载红楼梦,下载一个三国,然后再下载一个其它书籍。我现在是希望三本书下载完成之后统一告诉我,这样会比较好一些。如果下载完一本告诉我一下,下载完一本告诉我一下,其实我实际上最想看的是最后一本

2. 使用
      dispatch_queue_t q = dispatch_get_globel_queue(0,0);//创建一个队列
      dispatch_group_t g = dispatch_group_create();//创建一个调度组
      添加任务让队列调度,最后通知调度组
      dispatch_group_async(g,q,^{
      //任务一
      });
      dispatch_group_async(dispatch_group_async)(g,p,^{
      //任务二
      );
      dispatch_group_async(g,p,^{
      //任务三
      })
3. 通知
       dispatch_group_notify(g,p,^{
       //所有任务执行完成
        });
4. 进入和离开方法
       dispatch_queue_t q = dispatch_get_globel_queue(0,0);//创建一个队列
      dispatch_group_t g = dispatch_group_create();//创建一个调度组
      //进入调度组  执行此函数后  再异步执行任务后   会被调度租监听
      dispatch_group_enter(g);
      dispatch_async(q,^{
      dispatch_group_leave(g);
      //离开调度组 进入和离开方法要一一对应
      })
      dispatch_group_enter(g);//再次进入
       dispatch_async(q,^{
      dispatch_group_leave(g);
      //另一个任务
      })
      dispatch_group_notify(g,q,^{
      //完成全部任务
      });

常见问题

 主线程同步操作造成死锁
         // 1. 队列 -> 一启动就有主线程,主队列只需要获取
        dispatch_queue_t q = dispatch_get_main_queue();
        dispatch_sync(q, ^{
        NSLog(@"能来吗?");
        });
        NSLog(@"能来吗?");
原因:互相等待
解决方案:
 dispatch_async(dispatch_get_global_queue(0, 0), ^ {
      dispatch_queue_t q = dispatch_get_main_queue();
        dispatch_sync(q, ^{
        NSLog(@"能来吗?");
        });
      });

总结:使用gcd的时候尽量避免多层嵌套,尽量避免超过三层的时候,会是结构过于复杂。