一、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, ), ^{
  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, ), ^{
  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, ), ^{
  29.  
  30. // 开启新的图形上下文
  31. UIGraphicsBeginImageContext(CGSizeMake(, ));
  32.  
  33. // 绘制图片
  34. [self.image1 drawInRect:CGRectMake(, , , )];
  35. [self.image2 drawInRect:CGRectMake(, , , )];
  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. }

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

  1. iOS边练边学--多线程介绍、NSThread的简单实用、线程安全以及线程之间的通信

    一.iOS中的多线程 多线程的原理(之前多线程这块没好好学,之前对多线程的理解也是错误的,这里更正,好好学习这块) iOS中多线程的实现方案有以下几种 二.NSThread线程类的简单实用(直接上代码 ...

  2. 【原】iOS多线程之线程间通信和线程互斥

    线程间通信 1> 线程间通信分为两种 主线程进入子线程(前面的方法都可以) 子线程回到主线程 2> 返回主线程 3> 代码 这个案例的思路是:当我触摸屏幕时,会在子线程加载图片,然后 ...

  3. 线程间通信的三种方式(NSThread,GCD,NSOperation)

    一.NSThread线程间通信 #import "ViewController.h" @interface ViewController ()<UIScrollViewDel ...

  4. iOS开发NSOperation 三:操作依赖和监听以及线程间通信

    一:操作依赖和监听 #import "ViewController.h" @interface ViewController () @end @implementation Vie ...

  5. iOS多线程之3.NSThread的线程间通信

      我们把一些耗时操作放在子线程,例如下载图片,但是下载完毕我们不能在子线程更新UI,因为只有主线程才可以更新UI和处理用户的触摸事件,否则程序会崩溃.此时,我们就需要把子线程下载完毕的数据传递到主线 ...

  6. iOS边练边学--iOS中的(ARC下)单粒模式(GCD实现)

    一.ARC中实现单粒模式 在.m 保留一个全局的static的实例 static id _名称; 重写allocWithZone:方法,在这里创建唯一的实例 提供一个类方法让外界访问唯一的实例 实现c ...

  7. iOS边练边学--Http网络再学习,简单介绍

    一.URL 什么是URL URL中常见的协议 二.Http Http的基本通信过程 发送Http请求的方法 GET 和 POST 对比 GET 和 POST 的选择 三.iOS中的Http学习 iOS ...

  8. iOS边练边学--CALayer,非根层隐式动画,钟表练习

    一.CALayer UIView之所以能显示在屏幕上,完全是因为他内部的一个图层 在创建UIView对象时,UIView内部会自动创建一个图层(即CALayer对象),通过UIView的layer属性 ...

  9. iOS边练边学--UIGestureRecognizer手势识别器简单介绍

    iOS 3.2之后,苹果退出了手势识别功能(Gesture Recognizer),在触摸事件处理方面,大大简化了开发者的开发难度. 一.UIGestureRecognizer UIGestureRe ...

随机推荐

  1. 【软件】图文解释XCode常用快捷键的使用

    一.关于运行调试 1.运行,停止,都在工具栏的Product里. Command + R  运行. Command + .  停止 2.F6单步调试.F7跳入,F8继续, 和Eclipse,VS类似 ...

  2. 2014 Super Training #9 E Destroy --树的直径+树形DP

    原题: ZOJ 3684 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3684 题意: 给你一棵树,树的根是树的中心(到其 ...

  3. np问题

    NP(np) Time Limit:1000ms Memory Limit:64MB 题目描述 LYK 喜欢研究一些比较困难的问题,比如 np 问题.这次它又遇到一个棘手的 np 问题.问题是这个样子 ...

  4. git rebase 介绍

    git rebase是对commit history的改写.当你要改写的commit history还没有被提交到远程repo的时候,也就是说,还没有与他人共享之前,commit history是你私 ...

  5. [转] 值得推荐的C/C++框架和库

    http://www.cppblog.com/merlinfang/archive/2014/12/26/209311.aspx

  6. oracle用sqlplus创建新用户,不是plsql developer

    1.sqlplus /nolog 2.conn /as sysdba 3.alter user system identified by "123456"; 4.alter use ...

  7. 构架高性能WEB网站的几点知识

    前言: 对于构架高性能的web网站大家都很感兴趣,本文从几点粗谈高性能web网站需要考虑的问题. HTML静态化 什么是html静态化? 说得简单点,就是把所有不是.htm或者.html的页面改为.h ...

  8. Caffe学习系列(17):模型各层数据和参数可视化

    cifar10的各层数据和参数可视化 .caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1p ...

  9. jquery-lazyload延迟加载图片 及 加载顺序 bug 修复

    jquery-lazyload延迟加载图片   代码修改片段 function update() { var counter = 0; /**fix by weiyj start***/ elemen ...

  10. 地图坐标转换 -- 火星坐标与GPS坐标

    第一次处理地理位置的数据的人,没什么经验,往往掉入很多坑浪费不少时间.我也是刚刚从坑里爬出来.这篇博文主要是把入门GPS轨迹分析的经验总结一下,以方便大家少走些弯路. (1)可视化 GPS 路径 刚拿 ...