目前在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 Queue指执行处理的等待队列。编程人员通过dispatch_async等函数可以将后面Block中包含的操作追加到Dispatch Queue中。Dispatch Queue按照追加的顺序(FIFO)执行处理。
图如下:
在GCD中,队列被分为两种:
- Serial Dispatch Queue:串行队列。
- Concurrent Dispatch Queue:并发队列。
Dispatch Queue的种类(为什么简书上markdown打表格没效。。)
看图可知: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只新开了一条线程,加进那个队列的都是按着顺序执行的!
接下来换成Concurrent Dispatch Queue ,只需改一个地方,NULL改成DISPATCH_QUEUE_CONCURRENT:
dispatch_queue_t queue = dispatch_queue_create("com.wang.MySerialDispatchQueue", DISPATCH_QUEUE_CONCURRENT);
再看:
此时的线程数开了就不止一个了,而且也不是按着顺序来的。
所以,串行队列和并发队列的比较如下:
图:
同步、异步、并发、串行说明
同步和异步决定要不要开新线程:
- 同步:在当前线程中执行任务,不具备开启新线程的功能
- 异步:在新线程中执行任务,具备开启新线程的能力
并发和串行决定任务的执行方式:
- 并发:多个任务并发(同时)执行
- 串行:一个任务执行完毕后,再执行下一个任务
GCD第一篇就记录到这里。