• iOS边练边学--GCD的基本使用、GCD各种队列、GCD线程间通信、GCD常用函数、GCD迭代以及GCD队列组


    一、GCD的基本使用

      <1>GCD简介

    • 什么是GCD
      • 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器”
      • 纯C语言,提供了非常多强大的函数
     
    • GCD的优势
      • GCD是苹果公司为多核的并行运算提出的解决方案
      • GCD会自动利用更多的CPU内核(比如双核、四核)
      • GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程)
      • 程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码

      <2>GCD的使用

    • GCD的使用就2个步骤
      • 定制任务
      • 确定想做的事情
    • 将任务添加到队列中
      • GCD会自动将队列中的任务取出,放到对应的线程中执行
      • 任务的取出遵循队列的FIFO原则:先进先出,后进后出

      <3>GCD的两个函数

      <4>GCD中容易混淆的术语

    二、GCD中的各种队列代码示例

      <1>异步函数 + 并发队列

      <2>同步函数 + 并发队列

      <3>异步函数 + 串行队列

    <4>同步函数 + 串行队列

      <5>异步函数 + 主队列

      <6>同步函数 + 主队列

    • 各种队列执行结果总结

    三、GCD线程间的通信

    • 小练习 -- 利用GCD下载图片,并显示

    四、GCD常用函数

      <1>延时执行的三种方法,这里再整理一遍

      <2>一次性代码

      <3>GCD barrier(屏障方法)

    五、GCD迭代

    • 小练习 -- 将from文件夹中的图片文件 快速 剪切 到to文件夹中

    六、GCD队列组

    • 小练习 -- 下载两张图片,最后合成一张
     1 // 队列组 -- 先将分组内的任务完成,再继续完成别的任务
     2 // -- 小练习,开启线程同时加载两张图片,最后开启线程合成两张图片
     3 - (void)group
     4 {
     5     // 创建组队列
     6     dispatch_group_t group = dispatch_group_create();
     7     
     8     // 下载图片,添加到组队列中执行
     9     dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    10         
    11         NSURL *url = [NSURL URLWithString:@"https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcTC9Yx9QWW8eh4xEVDZnBATSZXQHkL0LTM9hTdzjqeoT6jkrjzBGg"];
    12         
    13         NSData *data = [NSData dataWithContentsOfURL:url];
    14         
    15         self.image1 = [UIImage imageWithData:data];
    16     });
    17     
    18     dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    19         
    20         NSURL *url = [NSURL URLWithString:@"https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcQkEXf64P3SfSaLmFdjn9IwjGk5wMtZRfqivcijRplqMLUJbbm7kaNhaCsV"];
    21         
    22         NSData *data = [NSData dataWithContentsOfURL:url];
    23         
    24         self.image2 = [UIImage imageWithData:data];
    25     });
    26     
    27     // 合成图片,队列中的任务执行完后,执行这段代码
    28     dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    29         
    30         // 开启新的图形上下文
    31         UIGraphicsBeginImageContext(CGSizeMake(300, 150));
    32         
    33         // 绘制图片
    34         [self.image1 drawInRect:CGRectMake(0, 0, 150, 150)];
    35         [self.image2 drawInRect:CGRectMake(150, 0, 150, 150)];
    36         
    37         // 取得上下文中的图片
    38         UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    39         
    40         // 结束上下文
    41         UIGraphicsEndImageContext();
    42         
    43         // 回到主线程显示图片
    44         dispatch_async(dispatch_get_main_queue(), ^{
    45             // 4.将新图片显示出来
    46             self.imageView.image = image;
    47         });
    48     });
    49 }
  • 相关阅读:
    Java 期末考试
    Java 方法重载,方法重写(覆盖),继承等细节注意
    Java 方法(变量)修饰符的使用顺序
    java考试易错题大全
    python获取进程id号:
    C语言如何判断单个数字是否溢出:
    VS2017编译错误:#error: Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version
    VS2017出现不存在从"CString"到"const char*"的适当转换函数
    Python实现将图片以二进制格式保存到MySQL数据库中,以及取出:
    解决springboot 出现异常: java.net.BindException: Address already in use: bind
  • 原文地址:https://www.cnblogs.com/gchlcc/p/5417001.html
Copyright © 2020-2023  润新知