美文网首页
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 的基础知识

    同步和异步决定了要不要开启新的线程 同步:在当前线程中执行任务,不具备开启新线程的能力 异步:在新的线程中执行任务...

  • IOS多线程之NSoperation和GCD的比较

    GCD是基于c的底层api,NSOperation属于object-c类。iOS首先引入的是NSOperation...

  • NSOperation 与 GCD 的区别

    GCD是基于c的底层api,NSOperation属于object-c类。ios首先引入的是NSOperation...

  • Object-C_GCD_摘抄

    说明:权当笔记,摘抄Romit_Lee,GCD全解析,非常感谢这位大神,担心取消文章了,请这位大神收下我膝盖吧!!...

  • 多线程

    在Object-C中主要有NSThread, GCD, NSOperation三种方式来实现多线程编程。 NST...

  • 认识 JavaScript 六

    HTML DOM基础知识 ​ DOM(Document Object Model)是一个标准,W3C(Wor...

  • Object-C 基础知识

    --------------------| 浅复制和深复制区别 |------------------- 浅复制(...

  • iOS GCD的使用

    什么是GCD了解GCD前,需要了解的基础知识GCD的使用使用注意事项 -GCD学习前铺垫-什么是GCDGCD (G...

  • iOS GCD的使用

    本文的主要内容是: 什么是GCD 了解GCD前,需要了解的基础知识 GCD的使用 使用注意事项 -GCD学习前铺垫...

  • 第一天:

    Object-c 概述 object-c简称obj-c或者oc c:c语言 object:面向对象 object-...

网友评论

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

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