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

  • 相关阅读:
    [转载]C#流,字节数组,字符串
    [C#错误]未找到类型或命名空间名称" " (是否缺少 using 指令或程序集引用?)
    批处理删除带空格的长目录或文件夹
    注释换行 引号内的字符串没有正确结束
    oracle sqlplus运行sql文件
    Target runtime Apache Tomcat v6.0 is not defined.错误解决方法
    Tomcat:Caused by: java.lang.OutOfMemoryError: PermGen space
    虚拟机vmware启动太快无法进入bios的解决方法
    MySQL Error 1130 Host 'localhost' is not allowed to connect to this MySQL server
    如何远程判断服务器的操作系统?
  • 原文地址:https://www.cnblogs.com/OIMM/p/4972847.html
Copyright © 2020-2023  润新知