GCD

152 阅读1分钟

大神链接

  • 只执行一次并且是线程安全的,比如单例
static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSLog(@"只执行一次");
});
  • 1,2先在子线程执行,barrier在执行,然后3,4在执行
dispatch_queue_t queue = dispatch_queue_create("testQueue", DISPATCH_QUEUE_CONCURRENT);
   
dispatch_async(queue, ^{
	sleep(2.0);
    NSLog(@"1---%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
    sleep(2.0);
    NSLog(@"2---%@",[NSThread currentThread]);
});
//    dispatch_barrier_sync(queue, ^{
//        sleep(2.0);
//        NSLog(@"barrier -- %@",[NSThread currentThread]);
//    });
    dispatch_barrier_async(queue, ^{
        sleep(2.0);
        NSLog(@"barrier -- %@",[NSThread currentThread]);
    });
    NSLog(@"main--------");
    dispatch_async(queue, ^{
        sleep(2.0);
        NSLog(@"3---%@",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        sleep(2.0);
        NSLog(@"4---%@",[NSThread currentThread]);
    });
  • 遍历10次,每个在不同线程,但在begin和end之间完成
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
NSLog(@"begin----");
dispatch_apply(10, queue, ^(size_t index) {
	sleep(2.0);
    NSLog(@"%zu --- %@",index,[NSThread currentThread]);
});
NSLog(@"end----");
  • end 在 1,2,3执行完之后执行
dispatch_group_t group = dispatch_group_create();
    dispatch_queue_t currentQueue = dispatch_queue_create("testQueue", DISPATCH_QUEUE_CONCURRENT);
    
    dispatch_group_async(group, currentQueue, ^{
        sleep(2.0);
        NSLog(@"1---%@",[NSThread currentThread]);
    });
    dispatch_group_notify(group, currentQueue, ^{
        sleep(2.0);
        NSLog(@"end ----- %@",[NSThread currentThread]);
    });
    dispatch_group_async(group, currentQueue, ^{
        sleep(2.0);
        NSLog(@"2---%@",[NSThread currentThread]);
    });
    dispatch_group_async(group, currentQueue, ^{
        sleep(2.0);
        NSLog(@"3---%@",[NSThread currentThread]);
    });
  • end 在所有任务完成在执行
dispatch_group_t group = dispatch_group_create();
    dispatch_queue_t currentQueue = dispatch_queue_create("testQueue", DISPATCH_QUEUE_CONCURRENT);
    
    dispatch_group_async(group, currentQueue, ^{
        sleep(2.0);
        NSLog(@"1---%@",[NSThread currentThread]);
    });
    dispatch_group_async(group, currentQueue, ^{
        sleep(2.0);
        NSLog(@"2---%@",[NSThread currentThread]);
    });
    dispatch_group_async(group, currentQueue, ^{
        sleep(2.0);
        NSLog(@"3---%@",[NSThread currentThread]);
    });
    
    // 上面任务全部完成后,执行下面
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
    NSLog(@"end-----");