美文网首页
Object - C GCD 的基础知识

Object - C GCD 的基础知识

作者: 133sheiya | 来源:发表于2019-05-05 11:42 被阅读0次
     ///创建全局队列
    ///们可以在block里运行各种耗时的操作(如网络请求) 而同时不会阻塞UI线程。 
    ///dispatch_get_global_queue 会获取一个全局队列,我们姑且理解为系统为
    ///我们开启的一些全局线程。我们用priority指定队列的优先级,而flag作
    ///为保留字段备用(一般为0)    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            for (int i = 0; i < 2; ++i) {
                NSLog(@"1------%@",[NSThread currentThread]);
            }
            
            // 回到主线程 一般执行更新界面的操作
            dispatch_async(dispatch_get_main_queue(), ^{
                NSLog(@"2-------%@",[NSThread currentThread]);
            });
        });
    
        //创建串行队列 第一个参数表示队列的唯一标示符,用于debug。可为空。 第二个参数表明是串行队列 还是并行队列
        dispatch_queue_t queue1 = dispatch_queue_create("test.evecom.syc", DISPATCH_QUEUE_SERIAL);
        //创建并发队列
        dispatch_queue_t queue2 = dispatch_queue_create("test.evecom.asyc", DISPATCH_QUEUE_CONCURRENT);
        //获取主队列
        dispatch_queue_t queue3 = dispatch_get_main_queue();
    
    

    同步和异步决定了要不要开启新的线程

    同步:在当前线程中执行任务,不具备开启新线程的能力

    异步:在新的线程中执行任务,具备开启新线程的能力

    并发和串行决定了任务的执行方式

    并发:多个任务并发(同时)执行

    串行:一个任务执行完毕后,再执行下一个任务

       ///同步串行
        dispatch_sync(queue1, ^{
            //// 同步执行任务代码
        });
        //异步并发
        dispatch_async(queue2, ^{
            //// 异步执行任务代码
        });
    
      NSLog(@"currentThread --- %@",[NSThread currentThread]); ///打印出当前线程
        NSLog(@"syncConcurrent--- Start");
        dispatch_queue_t queue2 = dispatch_queue_create("test.evecom.asyc", DISPATCH_QUEUE_CONCURRENT);
        
        dispatch_async(queue2, ^{
            for (int i = 0; i < 4; ++i) {
                [NSThread sleepForTimeInterval:2];              // 模拟耗时操作
                NSLog(@"1---%@",[NSThread currentThread]);      // 打印当前线程
            }
        });
        
        dispatch_async(queue2, ^{
            // 追加任务2
            for (int i = 0; i < 2; ++i) {
                [NSThread sleepForTimeInterval:2];              // 模拟耗时操作
                NSLog(@"2---%@",[NSThread currentThread]);      // 打印当前线程
            }
        });
        
        dispatch_async(queue2, ^{
            // 追加任务2
            for (int i = 0; i < 2; ++i) {
                [NSThread sleepForTimeInterval:2];              // 模拟耗时操作
                NSLog(@"3 ---%@",[NSThread currentThread]);      // 打印当前线程
            }
        });
        
        /**
         所有任务是在打印的syncConcurrent---begin和syncConcurrent---end之后才执行的。说明当前线程没有等待,而是直接开启了新线程,在新线程中执行任务(异步执行不做等待,可以继续执行任务)
         
         **/
        NSLog(@"syncConcurrent---end");
    
    //    GCD 栅栏方法:dispatch_barrier_async
    //    我们有时需要异步执行两组操作,而且第一组操作执行完之后,才能开始执行第二组操作。
        
        dispatch_queue_t queue = dispatch_queue_create("net.evecom.iOSQ", DISPATCH_QUEUE_CONCURRENT); //创建并行队列
        
        dispatch_async(queue, ^{
            // 追加任务1
            for (int i = 0; i < 2; ++i) {
                [NSThread sleepForTimeInterval:2];              // 模拟耗时操作
                NSLog(@"1 %d---%@",i,[NSThread currentThread]);      // 打印当前线程
            }
        });
        dispatch_async(queue, ^{
            // 追加任务2
            for (int i = 0; i < 2; ++i) {
                [NSThread sleepForTimeInterval:2];              // 模拟耗时操作
                NSLog(@"2 %d---%@",i,[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]);      // 打印当前线程
            }
        });
        ///在dispatch_barrier_async执行结果中可以看出:
        
    //    在执行完栅栏前面的操作之后,才执行栅栏操作,最后再执行栅栏后边的操作
    
    /** GCD 队列组 dispatch_group */
    
    -(void)dispatchGroup{
    //    有时候我们会有这样的需求:分别异步执行2个耗时任务,然后当2个耗时任务都执行完毕后再回到主线程执行任务。这时候我们可以用到 GCD 的队列组
        
        NSLog(@"currentThread%@", [NSThread currentThread]);
        
        NSLog(@"group---begin");
        
        dispatch_group_t group = dispatch_group_create(); //创建队列组
        
        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //全局并行队列
        
        
        dispatch_group_async(group, queue, ^{
            // 追加任务1
            for (int i = 0; i < 2; ++i) {
                [NSThread sleepForTimeInterval:2];              // 模拟耗时操作
                NSLog(@"1---%@",[NSThread currentThread]);      // 打印当前线程
            }
        });
        dispatch_group_async(group, queue, ^{
            // 追加任务2
            for (int i = 0; i < 2; ++i) {
                [NSThread sleepForTimeInterval:2];              // 模拟耗时操作
                NSLog(@"2---%@",[NSThread currentThread]);      // 打印当前线程
            }
        });
    //    当所有任务都执行完成之后,才执行dispatch_group_notify block 中的任务。
        dispatch_group_notify(group, dispatch_get_main_queue(), ^{
            // 等前面的异步任务1、任务2都执行完毕后,回到主线程执行下边任务
            for (int i = 0; i < 2; ++i) {
                [NSThread sleepForTimeInterval:2];              // 模拟耗时操作
                NSLog(@"3---%@",[NSThread currentThread]);      // 打印当前线程
            }
            NSLog(@"group---end");
        });
        NSLog(@"group---end2");
    }
    //暂停当前线程(阻塞当前线程),等待指定的 group 中的任务执行完成后,才会往下继续执行
    -(void)groupWait{
        
        NSLog(@"%@",[NSThread currentThread]);
        
        NSLog(@"group --- begin");
        
        dispatch_group_t group = dispatch_group_create();
        
        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        
        dispatch_group_async(group, queue, ^{
            // 追加任务1
            for (int i = 0; i < 2; ++i) {
                [NSThread sleepForTimeInterval:2];              // 模拟耗时操作
                NSLog(@"1---%@",[NSThread currentThread]);      // 打印当前线程
            }
        });
        dispatch_group_async(group, queue, ^{
            // 追加任务1
            for (int i = 0; i < 2; ++i) {
                [NSThread sleepForTimeInterval:2];              // 模拟耗时操作
                NSLog(@"2---%@",[NSThread currentThread]);      // 打印当前线程
            }
        });
        
        dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
    //    等待上面的任务全部完成后,会往下继续执行(会阻塞当前线程)
        NSLog(@"group --- end");
    }
    
    

    相关文章

      网友评论

          本文标题:Object - C GCD 的基础知识

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