IOS 多线程之GCD使用

2019-04-10  本文已影响0人  Devil_Chen

GCD

简介

优势

一、基本概念

二、基本使用

1、主队列和全局队列

1.1、主队列

1.2、全局队列

2、混合使用

2.1、串行+同步

    //创建串行队列
    dispatch_queue_t queue_serial = dispatch_queue_create("com.test.queue_serial", DISPATCH_QUEUE_SERIAL);
    
    NSLog(@"队列创建完成");
    dispatch_sync(queue_serial, ^{
        NSLog(@"1");
    });
    NSLog(@"2");
输出结果

2.2、串行+异步

    //创建串行队列
    dispatch_queue_t queue_serial = dispatch_queue_create("com.test.queue_serial", DISPATCH_QUEUE_SERIAL);
    
    NSLog(@"队列创建完成");
    dispatch_async(queue_serial, ^{
        NSLog(@"1");
    });
    NSLog(@"2");
输出结果

2.3、串行+同步+异步

2.3.1、混搭情况一
    //创建串行队列
    dispatch_queue_t queue_serial = dispatch_queue_create("com.test.queue_serial", DISPATCH_QUEUE_SERIAL);
    
    NSLog(@"队列创建完成");
    dispatch_sync(queue_serial, ^{
        NSLog(@"1");
        dispatch_async(queue_serial, ^{
            NSLog(@"2");
        });
    });
    NSLog(@"3");
输出结果
2.3.1、混搭情况二(此种情况会奔溃,请注意)
    //创建串行队列
    dispatch_queue_t queue_serial = dispatch_queue_create("com.test.queue_serial", DISPATCH_QUEUE_SERIAL);
    
    NSLog(@"队列创建完成");
    dispatch_async(queue_serial, ^{
        NSLog(@"1");
        dispatch_sync(queue_serial, ^{
            NSLog(@"2");
        });
        NSLog(@"4");
    });
    NSLog(@"3");
奔溃图
image.png

2.4、并行+同步

    //创建并行队列
    dispatch_queue_t queue_concurrent = dispatch_queue_create("com.test.queue_serial", DISPATCH_QUEUE_CONCURRENT);
    NSLog(@"队列创建完成");
    dispatch_sync(queue_concurrent, ^{
        NSLog(@"1");
    });
    NSLog(@"2");
输出结果

2.4、并行+异步

    //创建并行队列
    dispatch_queue_t queue_concurrent = dispatch_queue_create("com.test.queue_concurrent", DISPATCH_QUEUE_CONCURRENT);
    NSLog(@"队列创建完成");
    dispatch_async(queue_concurrent, ^{
        NSLog(@"1");
    });
    NSLog(@"2");
输出结果

2.5、并行+同步+异步

2.5.1、混搭情况一
    //创建并行队列
    dispatch_queue_t queue_concurrent = dispatch_queue_create("com.test.queue_concurrent", DISPATCH_QUEUE_CONCURRENT);
    NSLog(@"队列创建完成");
    dispatch_async(queue_concurrent, ^{
        NSLog(@"1");
        dispatch_sync(queue_concurrent, ^{
            NSLog(@"2");
        });
        NSLog(@"4");
    });
    NSLog(@"3");
输出结果
2.5.1、混搭情况二
    //创建并行队列
    dispatch_queue_t queue_concurrent = dispatch_queue_create("com.test.queue_concurrent", DISPATCH_QUEUE_CONCURRENT);
    NSLog(@"队列创建完成");
    dispatch_sync(queue_concurrent, ^{
        NSLog(@"1");
        dispatch_async(queue_concurrent, ^{
            NSLog(@"2");
        });
        NSLog(@"4");
        
    });
    NSLog(@"3");
image.png

3、其它队列与主队列通讯

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"耗时操作");
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"更新UI");
        })
    })

三、深入一点点使用

1、延时执行

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        // 5秒后在主队列中执行
        NSLog(@"%@",[NSThread currentThread]);
    });

2、只执行一次(多用于单例)

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        // 只执行1次的代码(默认是线程安全的)
    });

3、快速遍历

    NSArray *array = @[@"value1",@"value2",@"value3",@"value4",@"value5",@"value6"];
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_apply([array count], queue, ^(size_t index) {
        NSLog(@"%zu------%@",index, [array objectAtIndex:index]);
    });
快速遍历

4、栅栏函数

    //创建并行队列
    dispatch_queue_t queue = dispatch_queue_create("com.test.queue_barrier", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, ^{
        NSLog(@"1-->%@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"2-->%@", [NSThread currentThread]);
    });
    
    dispatch_barrier_async(queue, ^{
        NSLog(@"barrier-->%@", [NSThread currentThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"3-->%@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"4-->%@", [NSThread currentThread]);
    });
输出结果

5、调度组

-(void) gcdGroupTest
{
    dispatch_group_t group =  dispatch_group_create();
    //获取全局并行队列
    dispatch_queue_t queue_concurrent = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    dispatch_group_async(group, queue_concurrent, ^{
        NSLog(@"耗时操作1");
    });
    
    dispatch_group_async(group, queue_concurrent, ^{
        NSLog(@"耗时操作2");
    });
    
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        // 等任务都执行完毕后,回到主线程
        NSLog(@"任务组任务完成后-->%@",[NSThread currentThread]);
    });
    dispatch_group_async(group, queue_concurrent, ^{
        NSLog(@"耗时操作3");
    });
    dispatch_group_async(group, queue_concurrent, ^{
        NSLog(@"耗时操作4");
    });
}

-(void) gcdGroupTest2
{
       dispatch_group_t group =  dispatch_group_create();
    //获取全局并行队列
    dispatch_queue_t queue_concurrent = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_group_enter(group);
    dispatch_async(queue_concurrent, ^{
        NSLog(@"耗时操作1");
        dispatch_group_leave(group);
    });
    dispatch_group_enter(group);
    dispatch_async(queue_concurrent, ^{
        NSLog(@"耗时操作2");
        dispatch_group_leave(group);
    });
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        // 等任务都执行完毕后,回到主线程
        NSLog(@"任务组任务完成后-->%@",[NSThread currentThread]);
    });
    dispatch_group_enter(group);
    dispatch_async(queue_concurrent, ^{
        NSLog(@"耗时操作3");
        dispatch_group_leave(group);
    });
    dispatch_group_enter(group);
    dispatch_async(queue_concurrent, ^{
        NSLog(@"耗时操作4");
        dispatch_group_leave(group);
    });

}
image.png
上一篇 下一篇

猜你喜欢

热点阅读