GCD (Grand Central Dispatch) 是Apple公司开发的一种技术,它旨在优化多核环境中的并发操作并取代传统多线程的编程模式。 在Mac OS X 10.6和IOS 4.0之后开始支持GCD。

使用GCD的一个理由就是方便。回想一下以前的多线程编程,我们会把异步调用的代码放到另外的一个函数中,并通过NSThread开启新线程来启动这段代码。 这种跳来跳去的流程对于复杂的逻辑简直就是一场灾难。更糟糕的是,调用线程时的环境对异步代码是不可见的,如果我们需要当时的临时变量的话只有两个选择: 保存到类成员变量中或者作为参数传递过去。前者会造成很多莫名奇妙的无关类成员,而后者的功能过于有限。

GCD相对来说是一种更优雅的方式,看如下代码:

NSString* parameter = [self getSomeParameter];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{NSString* result = [self fetchResultFromWebWithParameter:parameter];dispatch_async(dispatch_get_main_queue(), ^{[self updateUIWithResult:result];});
});

在上面的代码中,出现了一种奇怪的格式:

^{code...}

解释一下,当一段代码被花括号包裹并在开头放置上尖号时,我们称之为块(block)。如果你学过C语言的话(实际上,block正是apple对C的一个扩展), 你可以认为这是一个增强型的函数指针。它不仅可以当做一个变量来回传递,还可以引用本身环境之外的变量(如上面代码中的parameter)。 更进一步地说,它是apple的C扩展中闭包的实现。在block里引用的对象会自动被retain,因此你也不必担心内存的问题。

另外涉及到了三个函数

void dispatch_async(dispatch_queue_t queue,dispatch_block_t block);dispatch_queue_t dispatch_get_global_queue(long priority,unsigned long flags); dispatch_get_main_queue();

dispatch_async 函数会将传入的block块放入指定的queue里运行。这个函数是异步的,这就意味着它会立即返回而不管block是否运行结束。因此,我们可以在block里运行各种耗时的操作(如网络请求) 而同时不会阻塞UI线程。 
dispatch_get_global_queue 会获取一个全局队列,我们姑且理解为系统为我们开启的一些全局线程。我们用priority指定队列的优先级,而flag作为保留字段备用(一般为0)。 
dispatch_get_main_queue 会返回主队列,也就是UI队列。它一般用于在其它队列中异步完成了一些工作后,需要在UI队列中更新界面(比如上面代码中的[self updateUIWithResult:result])的情况。

好的,知道这些特性之后,我们可以这样理解上面的代码:利用parameter变量异步地发起一个网络请求,并在请求之后更新UI线程。

转载于:https://www.cnblogs.com/cynthia116/p/5038425.html

dispatch_async 与 dispatch_get_global_queue相关推荐

  1. ios 11 CORE ML 学习入门

    导语:在刚刚过去的WWDC上,苹果发布了Core ML这个机器学习框架.现在,开发者可以轻松的使用Core ML把机器学习功能集成到自己的应用里,让应用变得更加智能,给用户更牛逼的体验. 苹果在 iO ...

  2. Using dispatch_async

    1 dispatch_async(dispatch_get_main_queue(), ^{ 2 //do some thing in Main_UI_Queue 3 }); 4 5 dispatch ...

  3. ios5中apple增加了解析JSON的api——NSJSONSerialization。

    ios5中apple增加了解析JSON的api--NSJSONSerialization.网上已经有人做过测试,NSJSONSerialization在效率上完胜SBJSON.TouchJSON.YA ...

  4. 09-dispatch_source

    dispatch_source 是BSD系内核惯有的kqueue的包装,kqueue 是XNU内核中发生各种事件时,在应用程序编程中执行处理的技术. CPU 负荷非常小,尽量不占用资源. dispat ...

  5. 07-主队列和全局队列

    GCD 会主动的提供一个队列供开发者使用. 主队列 系统提供的串行队列 是在主线程执行的队列,所以是串行的队列.任务一个个执行. dispatch_get_main_queue() 全局队列 系统提供 ...

  6. 02-dispatch_barrier

    1 dispatch_barrier_async 概念 栅栏方法,暂时的将一部操作做成一个同步操作,向一个栅栏一样的分开 dispatch_barrier_async函数的作用是在进程管理中起到一个栅 ...

  7. 利用runtime实现KVO

    KVO实现原理 一.关于KVO KVO(Key-Value Observing)提供一种机制,当指定对象的属性被修改后,就会通知观察者.简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动 ...

  8. iOS多线程全套:线程生命周期,多线程的四种解决方案,线程安全问题,GCD的使用,NSOperation的使用(上)

    2017-07-08 remember17 Cocoa开发者社区 目的 本文主要是分享iOS多线程的相关内容,为了更系统的讲解,将分为以下7个方面来展开描述. 多线程的基本概念 线程的状态与生命周期 ...

  9. iOS App 连接外设的几种方式

    原创作者: Max_Marry 文章地址: http://www.jianshu.com/p/852bf92c5c92 随着近年来车联网和物联网的兴起,智能家居和智能硬件的逐步火热,越来越多的 App ...

最新文章

  1. 每日一皮:男同胞们小心,连视频直播都被东南亚邪术控制了...
  2. iOS开发——UI基础-UIImage,UIImageView的使用
  3. mysql 事物gljbie_图片转成base64格式上传至数据库
  4. mongoDB研究笔记:分片集群的工作机制
  5. 我的服务端JS文件合并工具
  6. javascript动态修改对象的属性名
  7. 团队项目—第二阶段第五天
  8. python3中浮点数float的四舍五入,round跟decimal区别
  9. WinRAR4.0注册码
  10. c语言不合法字符串常量,不合法的字符常量是什么
  11. win10自带虚拟机 Hyper-V下载和安装linux系统
  12. c#语言猜数字游戏,C#实现猜数字游戏
  13. 域名dns劫持问题如何预防
  14. 在C#中使用WIA获取扫描仪数据(三、利用Filter处理图片)
  15. 项目学习 —— 图书商城后台管理
  16. cadence 原理图不能打印成PDF 解决方案
  17. 9保健…口腔常见疾病的预防与治疗
  18. 麻雀搜索算法SSA(有matlab代码,复制粘贴即可)
  19. ecs云服务器 系统登陆密码,云服务器ecs怎么登陆密码
  20. tomcat集群redis配置session共享

热门文章

  1. [转载]windows内存优化 没你想像那么美
  2. 使用opencv作物件识别(一) —— 积分直方图加速HOG特征计算
  3. 更新词汇至Unigram词表进行识别
  4. 如何评估AI在医学影像识别中的应用效果?
  5. python基础:条件循环字符串
  6. Linux下安装PHP7.1并做关联APACHE处理
  7. 《Xcode实战开发》——1.2节参与计划
  8. C++对象模型详解(上)
  9. 我这样理解技术人的成长过程
  10. mysql配置文件检查方法