iOS GCD

作者: 阿木小丸子 | 来源:发表于2024-03-25 11:57 被阅读0次

    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
    到我了
    到我了
    到我了
    到我了
    到我了
    

    相关文章

      网友评论

          本文标题:iOS GCD

          本文链接:https://www.haomeiwen.com/subject/ckfrtjtx.html