IOS开发—GCD介绍

来源:互联网 发布:genbank数据库记录 编辑:程序博客网 时间:2024/06/12 22:03

GCD介绍


一、GCD核心概念

1、任务:需要执行的操作

2、队列:用来存放任务

将任务放到队列中,DCD会自动将任务从队列中取出,放到对应的线程中执行。


二、GCD中执行任务的函数

1、同步函数:用同步的方式执行任务

dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);

2、异步函数:用异步的方式执行任务

dispatch_async(dispatch_queue_t queue, dispatch_block_t block)

同步和异步的区别:

同步:在当前线程中执行

异步:在另一条线程中执行


三:队列的类型

1、串行队列:让任务一个接一个执行(当前任务执行完毕,才能执行下一个任务)


2、并行队列:多个任务并发(同时)执行,(自动开启多个线程同时执行任务),并发队列只有在异步函数中有效,因为并发队列要想执行多个任务首先得开启多个线程,而同步函数不会开启新的线程。



四:区别同步、异步、并发、串行

1、同步和异步决定是否开启新的线程

同步:在当前线程中执行任务,不具备开启新线程的能力;

异步:在新的线程中执行任务,具备开启新线程的能力;

2、并发和串行决定了执行任务的方式

并发:多个任务同时(并发)执行。并发队列起效的前提是使用异步函数。

串行:一个任务执行完毕,再执行下一个任务


五、创建(获取)队列的方式

1、串行队列:

(1). 使用dispatch_queue_create函数创建串行队列

dispatch_queue_t queue =dispatch_queue_create("Lotheve", NULL);

//参数分别为队列名称、队列属性(一般用NULL即可)

(2).获取主队列(主队列是一种特殊的串行队列,放在主队列中的任务,都会放到主线程中执行)

dispatch_queue_t queue = dispatch_get_main_queue();

2、并发队列:

 使用dispatch_get_global_queue函数获得全局并发队列

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

第一个参数分别为全局队列优先级,进程中存在3个全局队列:低、中(默认)、高三个优先级队列,这里选择默认的。第二个参数暂时无用,用0即可。


六:各种队列的执行效果

首先大家要明确的一点是,并不是说一个队列对应一个线程,这种说法是不对的(当然主队列很特殊,它当中的任务全都在主线程中执行)。GCD使用的机制是,通过函数将任务放置在指定队列中,GCD将任务从队列中取出,分配到指定线程中执行。

各种队列的执行效果:



七、小结

1、用异步函数往并发队列添加任务:开启若干线程,实现了并发的效果。

2、用异步函数往串行队列添加任务:开启了一个线程。

3、用同步函数往并发队列添加任务:未开启线程,并发队列失去并发的功能。

4、用同步函数往串行队列添加任务:未开启线程。

另外:如果把任务放到主队列中执行,那么不论处理函数是同步函数还是异步函数,都不会开启新的线程。事实上,在主线程中使用同步函数执行主队列中的任务会产生死锁阻塞线程,而在非主线程中使用同步函数执行主队列中的任务是办不到的,因此只能用异步函数执行主队列中的任务,任务最终都将在主线程中执行
0 0