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

GCD是一个替代诸如NSThread等技术的很高效和强大的技术。GCD完全可以处理诸如数据锁定和资源泄漏等复杂的异步编程问题。

GCD可以完成很多事情,但是这里仅关注在iOS应用中实现多线程所需的一些基础知识。

在开始之前,需要理解是要提供给GCD队列的是代码块(block),用于在系统或者用户创建的的队列上调度运行。

block可以看作一个增强型的函数指针,可为变量赋值,也可以作为参数传递给函数或方法,当然也可以执行。

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线程

BLOCK

1. ^( 传人参数列) {函数体;};

举个例子int result = ^(int a) {return a*a;} (5); 表示返回传人参数的平方值。

2.返回值 ^(函数指针名) (传人参数列);

int (^sillyBlock)(int);      sillyBlock= ^(int a) {return a*a;}  ; int result = sillyBlock(5);

3.作为函数参数传人

int (^mySqaure) (int) = ^(int a) {return a*a;}; //定义一个有函数实体的block pointer

myFunction( mySqaure ) ; //作为参数传人

4.OC方法传人值的话需要把类型写在函数指针前面,然后加小括号

-(void) objcMethod:( int (^) (int) ) square; // square 参数的类型是 int (^) (int)

关于block详细内容可参考以下连接

GCD Block的更多相关文章

  1. Block 再学习 !

    如何优雅的使用 Block? How Do I Declare A Block in Objective-C? 阮一峰的一句话解释简洁明了:闭包就是能够读取其它函数内部变量的函数 详情:http:// ...

  2. block 对外部引用变量的处理

    MRC 环境 一.静态变量 和 全局变量   在加和不加  __block 都会直接引用变量地址.也就意味着 可以修改变量的值.在没有加__block 参数的情况下. 全局block 和 栈block ...

  3. GCD与block

    GCD技术多线程编程的三个技术  NSThread NSOperation GCD1.GCD(Grand central Dispatch:宏大的中央调度)        1) 是用纯C语言实现的.提 ...

  4. 一些关于Block, ARC, GCD的总结

    基础解释不做.基础的东西链接如下: 1. Block:https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Bl ...

  5. 包建强的培训课程(12):iOS深入学习(内存管理、Block和GCD等)

    @import url(/css/cuteeditor.css); @import url(http://i.cnblogs.com/Load.ashx?type=style&file=Syn ...

  6. block ,GCD(转)

    原文:http://blog.sina.com.cn/s/blog_45e2b66c01010dhd.html 1.GCD之dispatch queue http://www.cnblogs.com/ ...

  7. GCD code block

    在这里积累一些片段,由于备忘录. + (DRClass *)sharedDR{ //创建小黑.正常ap模式仅仅有一个小黑,so static DRClass *aDR = nil; static di ...

  8. Objective-C三种定时器CADisplayLink / NSTimer / GCD的使用

    OC中的三种定时器:CADisplayLink.NSTimer.GCD 我们先来看看CADiskplayLink, 点进头文件里面看看, 用注释来说明下 @interface CADisplayLin ...

  9. Objective-C中block的底层原理

    先出2个考题: 1. 上面打印的是几,captureNum2 出去作用域后是否被销毁?为什么? 同样类型的题目: 问:打印的数字为多少? 有人会回答:mutArray是captureObject方法的 ...

随机推荐

  1. mysqldump 使用 --set-gtid-purged

    1.导出时指定字符集,报错Character set 'utf-8' is not a compiled character set and is not specifie .--default-ch ...

  2. php & 引用

    引用的作用: 如果程序比较大,引用同一个对象的变量比较多,并且希望用完该对象后手工清除它,个人建议用 "&" 方式,然后用$var=null的方式清除. 其它时候还是用ph ...

  3. 去掉或者修改 input、select 等表单的【默认样式 】

    隐藏input等表单的默认样式的背景: textarea,select,input{-webkit-appearance: none; -moz-appearance: none; -o-appear ...

  4. tachyon 集群容错

    集群容错就是HA.这次顺带也练一下hadoop的HA 环境: centos6.5+jdk1.7+hadoop2.2.0+tachyon0.5.0+zookeeper3.4.6 hadoop 192.1 ...

  5. IIS 之 HTTP 错误 404.3 - Not Found(由于扩展配置问题而无法提供您请求的页面...)

    错误如下图所示: 其实在IIS7中肯定能支持的的,只是我们在Win7中安装IIS7的时候没有勾选这些功能,具体方法如下: 1.依次打开" 控制面板→程序→程序和功能→打开或关闭Windwos ...

  6. 懒加载异常:org.hibernate.LazyInitializationException: could not initialize proxy - no Session

    病症:这是一个lazy使用后的Exception,使用迟时加载,在session(hibernate里的session),关闭后使用该对象的未加载变量,也就是说session已经关闭,没有保存到内存中 ...

  7. setsockopt

    1.closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket:BOOL bReuseaddr=TRUE;setsockopt(s,SOL_SOCKET ,SO ...

  8. MySQL(21):事务管理之 事务提交

    1. 现实生活中,许多操作都是需要用户确认的,例如用户删除一个文档,删除时候会弹出一个提示对话框,包含"确认"和"取消".同样的道理,在数据库中有些命令在使用的 ...

  9. iOS制作gif动态图

    NSMutableArray * array = [NSMutableArray array]; for (int i = 1; i < 6; i++) { NSString * string ...

  10. 教您如何检查oracle死锁,决解死锁

    oracle死锁问题一直困扰着我们,下面就教您一个oracle死锁的检查方法,如果您之前遇到过oracle死锁方面的问题,不妨一看…… oracle死锁问题一直困扰着我们,下面就教您一个oracle死 ...