iOS GCD

参考链接 https://www.jianshu.com/p/d2622748c249 https://www.jianshu.com/p/324c2fded696
参考连接

主线程执行
dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"主线程");
    });
串行队列
  • 同步依次执行,在主线程依次执行
dispatch_queue_t queue = dispatch_queue_create("test", NULL);
    for (NSInteger i = 0; i < 10; i++) {
        dispatch_sync(queue, ^{
            NSLog(@" %@ - %ld ",[NSThread currentThread],(long)i);
        });
    }
  • 同步依次执行,在一个线程执行
dispatch_queue_t queue = dispatch_queue_create("test", NULL);
    for (NSInteger i = 0; i < 10; i++) {
        dispatch_async(queue, ^{
            NSLog(@" %@ - %ld ",[NSThread currentThread],(long)i);
        });
    }
并行队列
  • 创建多个线程,执行顺序不确定
dispatch_queue_t queue = dispatch_queue_create("test", DISPATCH_QUEUE_CONCURRENT);
    for (NSInteger i = 0; i < 10; i++) {
        dispatch_async(queue, ^{
            NSLog(@" %@ - %ld ",[NSThread currentThread],(long)i);
        });
    }
  • 不会新建线程,按顺序执行任务(几乎没用)
dispatch_queue_t queue = dispatch_queue_create("test", DISPATCH_QUEUE_CONCURRENT);
    for (NSInteger i = 0; i < 10; i++) {
        dispatch_sync(queue, ^{
            NSLog(@" %@ - %ld ",[NSThread currentThread],(long)i);
        });
    }
GCD 进阶操作
  • dispatch_once 保证该block在程序的生命周期中只执行依次,比如单例的创建
  • dispatch_after 延迟执行
  • dispatch_apply 快速遍历
在同步线程完成之后执行某操作(比如刷新UI)
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_group_t group = dispatch_group_create();
    dispatch_group_async(group, queue, ^{
        NSLog(@"queue1");
    });
    dispatch_group_async(group, queue, ^{
        NSLog(@"queue2");
    });
    dispatch_group_async(group, queue, ^{
        NSLog(@"queue3");
    });
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"全部队列完成");
    });
到某一步不能同步执行,必须要执行完之后才能再次同步
dispatch_queue_t queue = dispatch_queue_create("myCurrentQueue", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, ^{
        NSLog(@"读取操作1");
    });
    dispatch_async(queue, ^{
        NSLog(@"读取操作2");
    });
    dispatch_async(queue, ^{
        NSLog(@"读取操作3");
    });
    dispatch_barrier_async(queue, ^{
        NSLog(@"执行写入操作");
    });
    dispatch_async(queue, ^{
        NSLog(@"读取操作4");
    });
    dispatch_async(queue, ^{
        NSLog(@"读取操作5");
    });
    dispatch_async(queue, ^{
        NSLog(@"读取操作6");
    });

你可能感兴趣的:(iOS GCD)