GCD使用

作者: iOS小洁 | 来源:发表于2019-07-23 18:04 被阅读0次

    什么是 GCD

    Grand Central Dispatch(GCD) 是 Apple 开发的一个多核编程的较新的解决方法。它主要用于优化应用程序以支持多核处理器以及其他对称多处理系统。它是一个在线程池模式的基础上执行的并发任务。在 Mac OS X 10.6 雪豹中首次推出,也可在 iOS 4 及以上版本使用。

    队列和任务

    串行队列创建

    dispatch_queue_t queue = dispatch_queue_create("com.xyj.queue", DISPATCH_QUEUE_SERIAL);

    主队列获取,主队列属于串行队列

    dispatch_queue_t queue = dispatch_get_main_queue();

    并发队列创建

    dispatch_queue_t queue = dispatch_queue_create("com.xyj.queue", DISPATCH_QUEUE_CONCURRENT);

    全局队列获取,全局列属于并发队列

    dispatch_queue_t queue = dispatch_get_main_queue();

    区别 并发队列 串行队列 主队列
    同步(sync) 没有开启新线程,串行执行任务 没有开启新线程,串行执行任务,同一个串行队列中对当前队列sync操作都会导致死锁 主线程调用:死锁卡住不执行
    其他线程调用:没有开启新线程,串行执行任务
    异步(async) 有开启新线程,并发执行任务 有开启新线程(1条),串行执行任务 没有开启新线程,串行执行任务

    栅栏方法 dispatch_barrier_async

    在执行完栅栏前面的操作之后,才执行栅栏操作,最后再执行栅栏后边的操作。

    - (void)barrier {
        dispatch_queue_t queue = dispatch_queue_create("com.xyj.testQueue", DISPATCH_QUEUE_CONCURRENT);
        
        dispatch_async(queue, ^{
            // 追加任务1
            for (int i = 0; i < 2; ++i) {
                [NSThread sleepForTimeInterval:2];              // 模拟耗时操作
                NSLog(@"1---%@",[NSThread currentThread]);      // 打印当前线程
            }
        });
        dispatch_async(queue, ^{
            // 追加任务2
            for (int i = 0; i < 2; ++i) {
                [NSThread sleepForTimeInterval:2];              // 模拟耗时操作
                NSLog(@"2---%@",[NSThread currentThread]);      // 打印当前线程
            }
        });
        
        dispatch_barrier_sync(queue, ^{
            // 追加任务 barrier
            for (int i = 0; i < 2; ++i) {
                [NSThread sleepForTimeInterval:2];              // 模拟耗时操作
                NSLog(@"barrier-sync---%@",[NSThread currentThread]);// 打印当前线程
            }
        });
        
        dispatch_barrier_async(queue, ^{
            // 追加任务 barrier
            for (int i = 0; i < 2; ++i) {
                [NSThread sleepForTimeInterval:2];              // 模拟耗时操作
                NSLog(@"barrier---%@",[NSThread currentThread]);// 打印当前线程
            }
        });
        
        dispatch_async(queue, ^{
            // 追加任务3
            for (int i = 0; i < 2; ++i) {
                [NSThread sleepForTimeInterval:2];              // 模拟耗时操作
                NSLog(@"3---%@",[NSThread currentThread]);      // 打印当前线程
            }
        });
        dispatch_async(queue, ^{
            // 追加任务4
            for (int i = 0; i < 2; ++i) {
                [NSThread sleepForTimeInterval:2];              // 模拟耗时操作
                NSLog(@"4---%@",[NSThread currentThread]);      // 打印当前线程
            }
        });
        
        while (1) {
            
        }
    }
    

    GCD 延时执行方法:dispatch_after

    在执行完栅栏前面的操作之后,才执行栅栏操作,最后再执行栅栏后边的操作。

    GCD 队列组:dispatch_group

    有时候我们会有这样的需求:分别异步执行2个耗时任务,然后当2个耗时任务都执行完毕后再回到主线程执行任务。这时候我们可以用到 GCD 的队列组。

    • 调用队列组的 dispatch_group_async 先把任务放到队列中,然后将队列放入队列组中。或者使用队列组的 dispatch_group_enterdispatch_group_leave 组合 来实现dispatch_group_async
    • 调用队列组的 dispatch_group_notify 回到指定线程执行任务。或者使用 dispatch_group_wait 回到当前线程继续向下执行(会阻塞当前线程)。

    相关文章

      网友评论

        本文标题:GCD使用

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