iOS GCD

1、组:dispatch_group
多个网络请求执行完,再执行刷新

dispatch_group_t group = dispatch_group_create();
NSLog(@"开始执行");

dispatch_group_enter(group);
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
   NSLog(@"网络请求1");
   dispatch_group_leave(group);
}) ;

dispatch_group_enter(group);
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
   NSLog(@"网络请求2");
   dispatch_group_leave(group);
}) ;

dispatch_group_enter(group);
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
   NSLog(@"网络请求3");
   dispatch_group_leave(group);
}) ;

dispatch_group_notify(group, dispatch_get_main_queue(), ^{
     NSLog(@"刷新界面");
 });
dispatch_group_wait(group, DISPATCH_TIME_FOREVER) ;
NSLog(@"等我一下");

以上代码运行打印:

开始执行
网络请求1
网络请求2
网络请求3
等我一下
刷新界面

2、dispatch_once 通常在创建单例时使用
3、dispatch_after 延迟执行
4、dispatch_barrier_async 栅栏函数
分割异步任务

dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
   for (int i = 0; i< 3; i++) {
         NSLog(@"任务1");
    }
}) ;

dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
   for (int i = 0; i< 3; i++) {
         NSLog(@"任务2");
    }
}) ;

dispatch_barrier_async(dyConcurrent, ^{
        
        NSLog(@"拦一下");
    });

dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
   for (int i = 0; i< 3; i++) {
         NSLog(@"任务3");
    }
}) ;

dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
   for (int i = 0; i< 3; i++) {
         NSLog(@"任务4");
    }
}) ;

打印结果:121212拦一下343434

5、dispatch_apply 快速遍历
6、信号量 dispatch_semaphore
可控制最大并发

dispatch_semaphore_t  cacheSemphore =  dispatch_semaphore_create(5);
for (int i = 0; i< 10; i++) {
     dispatch_async(dispatch_queue_create("dyConcurrent1", DISPATCH_QUEUE_CONCURRENT), {
         dispatch_semaphore_wait(cacheSemphore , DISPATCH_TIME_FOREVER);
         NSLog(@"任务%ld",(long)i);
         sleep(1);
         NSLog(@"到我了");
         dispatch_semaphore_signal(cacheSemphore);
     });
}

打印结果:

任务0
任务1
任务2
任务3
任务4
到我了
到我了
到我了
到我了
到我了
任务5
任务6
任务7
任务8
任务9
到我了
到我了
到我了
到我了
到我了
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • GCD 简介 GCD 任务和队列 GCD 的使用步骤 GCD 的基本使用(六种组合不同区别,队列嵌套情况区别,相互...
    tanghaiyang阅读 2,895评论 0 2
  • iOS 开发之 GCD 不同场景使用[https://www.cnblogs.com/xiaoyouPrince/...
    mayuee阅读 3,283评论 0 0
  • 看了两遍 iOS 多线程:『GCD』详尽总结 ,这里我手打一遍加深下映象,仅供自己加深映象使用,具体参考上面的链接...
    3c32f188d5a4阅读 1,124评论 0 0
  • 1、GCD简介 全名:Grand Central Dispatch,它是苹果为多核的并行运算提出的解决方案,会合理...
    i_belive阅读 8,283评论 0 25
  • GCD 简介 https://developer.apple.com/documentation/dispatch...
    coder_my阅读 2,622评论 0 0