iOS基础·OC高级篇ios自己薄弱

iOS 笔记---GCD篇(1)

2016-03-24  本文已影响165人  七号萝卜

目前在iOS开发中,用到多线程的时候自然就想到用GCD,因为方便快捷,代码清晰。因此记录一下。

介绍

什么是GCD?
在官方解释里,全名为Grand Central Dispatch,是异步执行任务的技术之一。一般将应用程序中的线程管理用的代码在系统级中实现。所以可统一管理,也可执行任务,并且比以前的线程更有效率。
为什么要用GCD呢?
因为GCD很强大,它可以自动利用更多的CPU内核,会自动管理线程的生命周期(创建线程、调度任务、摧毁线程)。最最重要的原因是它用起来简单啊,只需要告诉GCD想要执行什么事情就行了,不需要编写任何线程管理的代码。

GCD可以用很简洁的语法就实现比较复杂的多线程编程。比如一个简单的GCD可以写成:

dispatch_async(queue,^{ 
//这里执行需要长时间处理的事情, 
//比如数据库访问,网络请求啥的 


    //结束后返回主线程执行结果,一般是刷新UI 
    dispatch_async(dispatch_get_main_queue(),^{ 
                  //界面刷新
     });
});

就这么几步就可以在后台开一个线程,然后执行了耗时操作返回主线程刷新。蛮简洁优雅的。GCD中的函数大多数是以dispatch开头。

再看看官方对GCD的说明:

开发者要做的只是定义想要执行的任务,并将之追加到适当的Dispatch Queue(队列)中。

于是,可得到GCD中有两个核心的概念:任务和队列。
看GCD的基本函数:

//用同步的方式执行任务
dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);

//用异步的方式执行任务
dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

有两个参数,第一个就是队列,第二个block就是任务。

什么是Dispatch Queue

Dispatch Queue指执行处理的等待队列。编程人员通过dispatch_async等函数可以将后面Block中包含的操作追加到Dispatch Queue中。Dispatch Queue按照追加的顺序(FIFO)执行处理。
图如下:


通过Dispatch Queue执行处理.png

在GCD中,队列被分为两种:

Dispatch Queue的种类(为什么简书上markdown打表格没效。。)

种类.png 两类Queue.png

看图可知:Serial需要里面的任务一个接一个的进行,而Concurrent即不会,会同时开几条线程执行。
比如我们输入下面代码:

//创建GCD队列
dispatch_queue_t queue = dispatch_queue_create("com.wang.MySerialDispatchQueue", NULL);
dispatch_async(queue, ^{ 
      NSLog(@"这是1----%@",[NSThread currentThread]);
 });
dispatch_async(queue, ^{ 
      NSLog(@"这是2----%@",[NSThread currentThread]);
 });
dispatch_async(queue, ^{ 
      NSLog(@"这是3----%@",[NSThread currentThread]);
 });
dispatch_async(queue, ^{ 
      NSLog(@"这是4----%@",[NSThread currentThread]);
 });
dispatch_async(queue, ^{ 
      NSLog(@"这是5----%@",[NSThread currentThread]);
 });
dispatch_async(queue, ^{ 
      NSLog(@"这是6----%@",[NSThread currentThread]);
 });

上面是Serial Dispatch Queue,看Log输出:


Serial Dispatch Queue.png

没错,Serial Dispatch Queue只新开了一条线程,加进那个队列的都是按着顺序执行的!
接下来换成Concurrent Dispatch Queue ,只需改一个地方,NULL改成DISPATCH_QUEUE_CONCURRENT:

dispatch_queue_t queue = dispatch_queue_create("com.wang.MySerialDispatchQueue", DISPATCH_QUEUE_CONCURRENT);

再看:


Concurrent Dispatch Queue.png

此时的线程数开了就不止一个了,而且也不是按着顺序来的。

所以,串行队列和并发队列的比较如下:
图:


开线程比较.png

同步、异步、并发、串行说明
同步和异步决定要不要开新线程:

并发和串行决定任务的执行方式:

GCD第一篇就记录到这里。

上一篇 下一篇

猜你喜欢

热点阅读