GCD的使用简单总结

作者: 浮桥小麦 | 来源:发表于2016-07-27 10:53 被阅读45次

GCD的知识技能点截图:

Snip20160727_1.png
知识点逐一简介
NO.1 GCD同步函数+串行队列(所有的都写为一个小方法,调用就好)
-(void)syncSerial
{
  //1.创建串行队列  
#"45":队列标签可以随便命名,但最好还是和自己要执行的任务有关(见名知意)
#DISPATCH_QUEUE_SERIAL:表示为串行队列的宏
 dispatch_queue_t queue = dispatch_queue_create("45", DISPATCH_QUEUE_SERIAL);
 //2.封装任务(其实就是把自己要执行的任务放入创建好的队列中)
 #  dispatch_sync:为同步函数,不具备开线程能力     
 dispatch_sync(queue, ^{
        //打印一句话和当前线程()
        NSLog(@"演员1-----%@",[NSThread currentThread]);
   });
    dispatch_sync(queue, ^{
       NSLog(@"演员2-----%@",[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
       NSLog(@"演员3-----%@",[NSThread currentThread]);
    });
}
#注:这样执行的三个任务都在主线程中执行且是串行执行的(即依次进行)

NO.2 GCD同步函数+并行队列
-(void)syncConcurrent
{
//1.创建队列(这个队列是自己创建的)
#DISPATCH_QUEUE_CONCURRENT:并发队列的宏
    dispatch_queue_t  queue = dispatch_queue_create( "126", DISPATCH_QUEUE_CONCURRENT);

 //2.封装任务
    dispatch_sync(queue, ^{
        //打印一句话和当前线程
      NSLog(@"演员1-----%@",[NSThread currentThread]);
   });
    dispatch_sync(queue, ^{
    NSLog(@"演员2-----%@",[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"演员3-----%@",[NSThread currentThread]);
   });

}
#注:不会开辟线程,在主线程中执行任务,任务是串行执行的
#获得系统的全局并发队列
 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
#DISPATCH_QUEUE_PRIORITY_DEFAULT:队列优先级的宏
NO.3 GCD异步函数+串行队列
-(void)asyncSerial
{
 //1.创建串行队列
    dispatch_queue_t queue = dispatch_queue_create("12345", DISPATCH_QUEUE_SERIAL);
 //2.封装任务(异步函数)
# dispatch_async:异步函数具备开线程的能力 
    dispatch_async(queue, ^{
   //打印一句话和当前线程(打印出来number = 2,是在子线程中执行的)
   NSLog(@"丑八怪啊-1-----%@",[NSThread currentThread]);
 });
  dispatch_async(queue, ^{
     NSLog(@"丑八怪啊-2-----%@",[NSThread currentThread]);
   });
dispatch_async(queue, ^{
      NSLog(@"丑八怪啊-3-----%@",[NSThread currentThread]);
   });
}
#注:会开线程,开一条线程,队列中的任务是依次执行的


NO.4 GCD异步函数+并发队列
-(void)asyncConcurrent
{
  //1.创建并发队列
dispatch_queue_t  queue = dispatch_queue_create( "123456", DISPATCH_QUEUE_CONCURRENT);
//2.封装任务(异步函数)
 dispatch_async(queue, ^{
    //打印一句话和当前线程
        NSLog(@"我爱你1-----%@",[NSThread currentThread]);
  });
dispatch_async(queue, ^{
      NSLog(@"我爱你2-----%@",[NSThread currentThread]);
    });
  dispatch_async(queue, ^{
      NSLog(@"我爱你3-----%@",[NSThread currentThread]);
   });
#注:会开启多条线程,队列中的任务是并发执行的
}
NO.5 GCD同步函数+主队列
-(void)syncMainQueue
{
   //1.获得主队列
    dispatch_queue_t queue = dispatch_get_main_queue();
   //2.封装任务
    dispatch_sync(queue, ^{
        //打印一句话和当前线程()
        NSLog(@"演员1-----%@",[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
       NSLog(@"演员2-----%@",[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"演员3-----%@",[NSThread currentThread]);
     });
}
#注:在主线程中执行,不会开线程
NO.6 GCD异步函数+主队列
-(void)asyncMainQueue
{
   //1.获得主队列
    dispatch_queue_t queue = dispatch_get_main_queue();
    //2.封装任务
    dispatch_async(queue, ^{
        //打印一句话和当前线程()
        NSLog(@"演员1-----%@",[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
      NSLog(@"演员2-----%@",[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
     NSLog(@"演员3-----%@",[NSThread currentThread]);
    });
}
#注:所有任务都在主线程中执行,不会开线程

GCD的常用函数

NO.1 延迟函数
//1.点击屏幕调用GCD方法
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    //GCD里面的延迟方法
    [self delay];
}   
//GCD里面的延迟方法
-(void)delay
{
//获得全局并发队列  
 dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
//GCD延迟函数 
  dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), queue, ^{
       [self task];
    });

}
//提供一个延迟调用的方法
-(void)task
{
 NSLog(@"我爱你---%@",[NSThread currentThread]);
}

NO.2 栅栏函数
#注:栅栏函数不能用在全局并发队列中,只能自己创建并发队列
//点击屏幕触发方法
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
//1.创建并发队列
 dispatch_queue_t queue = dispatch_queue_create("download", DISPATCH_QUEUE_CONCURRENT);
//2.异步函数
 //异步函数
    dispatch_async(queue, ^{
       NSLog(@"丑八怪1---%@",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"丑八怪2---%@",[NSThread currentThread]);
    });
  #实现需求:我们在1,2都执行完,才执行3(就可以用栅栏函数,拦截一下)
    dispatch_barrier_async(queue, ^{
        NSLog(@"------------------------------");
    });
   dispatch_async(queue, ^{
         NSLog(@"丑八怪3---%@",[NSThread currentThread]);
    });
}
#注:栅栏函数用来控制并发队列中的执行顺序

GCD线程间的通信

//点击屏幕下载一张图片(准备工作:在stroyboard拖一个UIImageView出来,把属性拖出来)
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
   #下载图片是一个耗时操作,我们放在子线程中去执行
   #创建子线程下载图片,用GCD的异步函数(这里只有一个任务用串行和并发的都行)
      dispatch_queue_t queue = dispatch_queue_create("123", DISPATCH_QUEUE_CONCURRENT);//并发队列

 //这段代码是在子线程中执行的
    dispatch_async(queue, ^{
      //下载图片
    //1.确定url
        NSURL *url = [NSURL URLWithString:@"http://img2.3lian.com/2014/f4/51/d/13.jpg"];
    //1.2 下载二进制数据到本地
   NSData *imageData = [NSData dataWithContentsOfURL:url];
      //1.3 将二进制数据转换为图片
        UIImage *image = [UIImage imageWithData:imageData];
//打印一下当前线程        
  NSLog(@"--%@",[NSThread currentThread]);
     # 现在图片有了,需要更新UI,就得回到主线程中
        dispatch_async(dispatch_get_main_queue(), ^{
            self.imageView.image = image;
        NSLog(@"***%@",[NSThread currentThread]);
        });
     });
  }
}
#GCD中的线程通信函数是可以嵌套的
后记:GCD主要用法大概总结了一下,还有些用法可以根据Xmind技能图自行补充

相关文章

  • GCD的使用简单总结

    GCD的知识技能点截图: 知识点逐一简介 NO.1 GCD同步函数+串行队列(所有的都写为一个小方法,调用就好)...

  • iOS进阶-多线程-GCD

    GCD 概念 GCD队列 使用总结 实用api 实用遇到的坑 一、 概念 GCD(grand central di...

  • iOS多线程:GCD Group、Barrier和NSOpera

    GCD系列文章 GCD任务和队列使用详解 本文主要总结GCD Group、Barrier和NSOperationQ...

  • 高级iOS面试题全纪录

    iOS基础: 多线程使用,gcd跟operation区别,怎么取消正在执行的gcd任务 GCD 系列知识总结 NS...

  • GCD -- 简单的总结!

    本文不说什么是GCD,只将其简单的总结,有利于在项目中的使用! 1.在GCD中,个人不需要关心线程的开辟! 2.任...

  • GCD介绍

    一、GCD简单介绍 什么是GCD GCD优势 任务和队列 GCD有2个核心概念 GCD的使用就2个步骤 将任务添加...

  • 多线程和AFN网络框架配合使用

    ios的多线程一般有NSOperation和GCD.NSOperation基本使用: GCD基本使用: 简单的多线...

  • GCD简单使用

  • GCD简单使用

    开发中有时候可能会有一些很耗时的操作,不可能说让屏幕一直卡着,等操作完成,那体验就很尴尬了。所以多线程还是需要来一...

  • GCD简单使用

    一.普通使用 1.后台执行 2.主线程执行 3.一次性执行 4.延迟两秒执行 自定义使用 1.自定义队列 2.两个...

网友评论

    本文标题:GCD的使用简单总结

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