IOS GCD 的理解

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,所以你也没必要担忧内存的问题。app

另外涉及到了三个函数异步

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])的状况。async

好的,知道这些特性以后,咱们能够这样理解上面的代码:利用parameter变量异步地发起一个网络请求,并在请求以后更新UI线程。函数

相关文章
相关标签/搜索