zoukankan      html  css  js  c++  java
  • iOS-线程之GCD---之GCD的几种常用常用的方法

    GCD中几种常见的方法

    1.代码只被执行一次:(利用这种方式,可以简单的创建一个单例对象)

    方法dispatch_once(&,^(void){});

     1 - (void)testOne
     2 
     3 {
     4 
     5     static dispatch_once_t onceToken;
     6 
     7     dispatch_once(&onceToken,^{
     8 
     9         NSLog(@"代码块只执行了一次");
    10 
    11     });
    12 
    13 }

    2.在两个线程之间执行一段代码,并且分离了线程,不会使它们同时执行

    方法:dispatch_barrier_async(queue,^(void){});

     1 - (void)testBarrier
     2 {
     3     //队列不能是系统的并行队列
     4     dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
     5     //线程一
     6     dispatch_async(concurrentQueue, ^{
     7         for (int i=0; i<100; i++) {
     8             NSLog(@"线程一:%d",i);
     9         }
    10     });
    11     //线程二
    12     dispatch_async(concurrentQueue, ^{
    13         for (int i=0; i<100; i++) {
    14             NSLog(@"线程二:%d",i);
    15         }
    16     });
    17     //在线程一,线程二执行完成之后,在线程三执行之前执行一段代码,再开始执行线程三
    18     dispatch_barrier_async(concurrentQueue, ^{
    19         NSLog(@"barrier");
    20     });
    21     
    22     //线程三
    23     dispatch_async(concurrentQueue, ^{
    24         for (int i=0; i<100; i++) {
    25             NSLog(@"线程三:%d",i);
    26         }
    27     });
    28     //线程四
    29     dispatch_async(concurrentQueue, ^{
    30         for (int i=0; i<100; i++) {
    31             NSLog(@"线程四:%d",i);
    32         }
    33     });
    34 }

    3.对此执行一段代码

    方法:dispatch_apply(size_t t,queue,^(size_t times){});

    block中的参数times是指当前执行的是队列中第几个线程,比如说:该方法要执行10次,就会在队列中创建10个线程,并且基本同时执行,times标识的就是当前第几个线程(所以times被打印是无序的).

     1 - (void)testApply
     2 {
     3     /*
     4      @param1 代码块执行的次数
     5      @param2 代码块所在的队列
     6      @param3 线程的执行体
     7      */
     8     size_t t = 10;
     9     dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    10     
    11     dispatch_apply(t, globalQueue, ^(size_t q){
    12         NSLog(@"线程一:%ld",q);
    13     });
    14 }

    4.代码在一段时间后执行

    方法:dispatch_after(dispatch_time_t time,queue,^(void){});---time参数为当前时间的多少秒后去执行Block中的代码

     1 - (void)testAffter
     2 {
     3     NSLog(@"执行之前");
     4     //当前时间10秒之后
     5     dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC * 10);
     6     /*
     7      @param1:时间
     8      @param2:线程所在的队列
     9      @param3:线程的执行体
    10      */
    11     dispatch_after(time, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    12         NSLog(@"执行了after");
    13     });
    14 }

    5.GCD还提供了组的概念,可以将所有队列(线程放在队列中)放到组中

    当组中所有队列中的线程执行完后,将会执行dispatch_group_notify(dispatch_group_t group,queue,^(void){});方法中Block

    作用:当一个页面需要多个下载时候,就可以将该将所有异步下载的线程添加到队列后再添加到组中,当完成了所有的下载,最后在dispatch_group_notify方法中重新刷新页面.

     1 //将线程放到一个组里面
     2 - (void)testGroup
     3 {
     4     //创建一个组
     5     dispatch_group_t group = dispatch_group_create();
     6     
     7     dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
     8     /*
     9      @param1:线程所在的组
    10      @param2:线程所在的队列
    11      @param3:线程的执行体
    12      */
    13     dispatch_group_async(group, globalQueue, ^{
    14         for (int i=0; i<100; i++) {
    15             NSLog(@"线程一:%d",i);
    16         }
    17     });
    18     //在组中在添加一个线程
    19     dispatch_group_async(group, globalQueue, ^{
    20         for (int i=0; i<100; i++) {
    21             NSLog(@"线程二:%d",i);
    22         }
    23     });
    24     
    25     //在多有线程组里面的所有线程执行完成之后调用的代码
    26     dispatch_group_notify(group, globalQueue, ^{
    27         NSLog(@"线程所有的方法执行完成");
    28     });
    29 }

     

    GCD如此强大,总有一款适合你..

  • 相关阅读:
    ios手机和Android手机测试点区别
    业务下的测试总结
    Mac下web自动化环境部署
    Mac下查找python的安装位置以及第三方库
    简易计算器
    递归
    可变参数
    方法的重载
    方法
    三角形
  • 原文地址:https://www.cnblogs.com/BeyondAverage0908/p/4713872.html
Copyright © 2011-2022 走看看