博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[转]GCD介绍
阅读量:6716 次
发布时间:2019-06-25

本文共 1616 字,大约阅读时间需要 5 分钟。

转发一篇博文备个份.

原链接:

http://lcwangchao.github.com/IOS/2012/06/07/gcdbegin/

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/csharpsharper/archive/2013/03/30/2990266.html

你可能感兴趣的文章
[javaSE] 位运算符(&|^)
查看>>
自定义控件 横向滑动控件 总结
查看>>
keil l251 command summary --Lib
查看>>
Hibernate Cascade
查看>>
java的技术调用栈图示例
查看>>
IIS 之 功能详解
查看>>
C#Base64编码
查看>>
spring主要的作用?
查看>>
Storm概念学习系列之storm的特性
查看>>
JQuery------$.get()和$.post()传递数据的使用方法
查看>>
Atitti 数据库事务处理 attilax总结
查看>>
Android中动态设置GridView的列数、列宽和行高
查看>>
oracle中修改表名
查看>>
PhpStorm下Laravel代码智能提示
查看>>
IntelliJ IDEA中运行Tomcat报内存溢出(java.lang.OutOfMemoryError: PermGen space)
查看>>
转】 Kafka文件存储机制那些事
查看>>
jquery怎么在点击li标签之后添加一个在class,点击下一个li时删除上一个class?...
查看>>
在Docker中运行web应用
查看>>
spring boot 框架 启动更新项目,以及生成 "实体_"文件
查看>>
android启动模式
查看>>