GCD Block

    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详细内容可参考以下连接

posted @ 2015-11-17 20:58  OIMMZC  阅读(225)  评论(0编辑  收藏  举报