dispatch_async 与 dispatch_get_global_queue
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相关推荐
- ios 11 CORE ML 学习入门
导语:在刚刚过去的WWDC上,苹果发布了Core ML这个机器学习框架.现在,开发者可以轻松的使用Core ML把机器学习功能集成到自己的应用里,让应用变得更加智能,给用户更牛逼的体验. 苹果在 iO ...
- Using dispatch_async
1 dispatch_async(dispatch_get_main_queue(), ^{ 2 //do some thing in Main_UI_Queue 3 }); 4 5 dispatch ...
- ios5中apple增加了解析JSON的api——NSJSONSerialization。
ios5中apple增加了解析JSON的api--NSJSONSerialization.网上已经有人做过测试,NSJSONSerialization在效率上完胜SBJSON.TouchJSON.YA ...
- 09-dispatch_source
dispatch_source 是BSD系内核惯有的kqueue的包装,kqueue 是XNU内核中发生各种事件时,在应用程序编程中执行处理的技术. CPU 负荷非常小,尽量不占用资源. dispat ...
- 07-主队列和全局队列
GCD 会主动的提供一个队列供开发者使用. 主队列 系统提供的串行队列 是在主线程执行的队列,所以是串行的队列.任务一个个执行. dispatch_get_main_queue() 全局队列 系统提供 ...
- 02-dispatch_barrier
1 dispatch_barrier_async 概念 栅栏方法,暂时的将一部操作做成一个同步操作,向一个栅栏一样的分开 dispatch_barrier_async函数的作用是在进程管理中起到一个栅 ...
- 利用runtime实现KVO
KVO实现原理 一.关于KVO KVO(Key-Value Observing)提供一种机制,当指定对象的属性被修改后,就会通知观察者.简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动 ...
- iOS多线程全套:线程生命周期,多线程的四种解决方案,线程安全问题,GCD的使用,NSOperation的使用(上)
2017-07-08 remember17 Cocoa开发者社区 目的 本文主要是分享iOS多线程的相关内容,为了更系统的讲解,将分为以下7个方面来展开描述. 多线程的基本概念 线程的状态与生命周期 ...
- iOS App 连接外设的几种方式
原创作者: Max_Marry 文章地址: http://www.jianshu.com/p/852bf92c5c92 随着近年来车联网和物联网的兴起,智能家居和智能硬件的逐步火热,越来越多的 App ...
最新文章
- 每日一皮:男同胞们小心,连视频直播都被东南亚邪术控制了...
- iOS开发——UI基础-UIImage,UIImageView的使用
- mysql 事物gljbie_图片转成base64格式上传至数据库
- mongoDB研究笔记:分片集群的工作机制
- 我的服务端JS文件合并工具
- javascript动态修改对象的属性名
- 团队项目—第二阶段第五天
- python3中浮点数float的四舍五入,round跟decimal区别
- WinRAR4.0注册码
- c语言不合法字符串常量,不合法的字符常量是什么
- win10自带虚拟机 Hyper-V下载和安装linux系统
- c#语言猜数字游戏,C#实现猜数字游戏
- 域名dns劫持问题如何预防
- 在C#中使用WIA获取扫描仪数据(三、利用Filter处理图片)
- 项目学习 —— 图书商城后台管理
- cadence 原理图不能打印成PDF 解决方案
- 9保健…口腔常见疾病的预防与治疗
- 麻雀搜索算法SSA(有matlab代码,复制粘贴即可)
- ecs云服务器 系统登陆密码,云服务器ecs怎么登陆密码
- tomcat集群redis配置session共享