iOS 多线程(四)GCD

本文详细介绍了iOS中GCD(Grand Central Dispatch)的使用,包括Dispatch Queue的类型、创建方式和执行任务的方法。内容涵盖串行队列与并行队列的异步同步操作、线程间通信、延时执行、Dispatch Group、dispatch_barrier_async的使用以及dispatch_once确保代码只执行一次的特性。通过对这些概念的解析,有助于开发者更好地理解和应用GCD进行多线程编程。
摘要由CSDN通过智能技术生成

GCD:Grand Central Dispatch(GCD) 是异步执行任务的技术之一。一般将应用程序中记述的线程管理用的代码在系统级中实现。开发者只需要定义想执行的任务并追加到适当的Dispatch Queue中,GCD就能生成必要的线程并计划执行任务。由于线程管理是作为系统的一部分来实现的,因此可以统一管理,也可执行任务,这样就比以前的线程更有效率。

1 Dispatch Queue

Dispatch Queue”是什么,如其名称所示,是执行处理的等待队列。Dispatch Queue 按照追加的顺序执行处理。先进先出FIFO,first-in-first-out。

队列类型:

1 Serial Dispatch Queue    等待现在执行处理结束

2 Concurrent Dispatch Queue  不等待现在执行处理结束

比较两种Dispatch Queue。

dispatch_sync(queue,block1);
dispatch_sync(queue,block2);
dispatch_sync(queue,block3);
dispatch_sync(queue,block4);
dispatch_sync(queue,block5);
dispatch_sync(queue,block6);
当queue为serial Dispatch Queue,会先执行block1,当block1执行完毕后,接着执行block2,当block2执行完毕后,接着执行block3,如此重复。同时执行的处理数只能有一个。

block1 -> block2-> block3-> block4-> block5-> block6

当queue为Concurrent Dispatch Queue时,首先执行block1,不管block1是否结束,都开始执行后面的block2,不管block2是否结束,都开始执行block3,如此重复循环。(同时执行的处理数量取决于当前系统的状态。)

线程1 线程2 线程3
block1 block2 block3
block4 block6 block5

创建方式

第一种方式:dispatch_queue_create

// 创建串行队列    <span style="font-family: Arial, Helvetica, sans-serif;">DISPATCH_QUEUE_SERIAL = NULL</span>
    dispatch_queue_t queue = dispatch_queue_create("com.baidu.queue", DISPATCH_QUEUE_SERIAL);


// 1.创建一个并发队列
    dispatch_queue_t queue = dispatch_queue_create("com.baidu.queue", DISPATCH_QUEUE_CONCURRENT);

虽然Serial Dispatch Queue 和Current Dispatch Queue将受到限制,但是使用dispatch_queue_create函数可生成人意多个Dispatch Queue。

当生成多个Serial Dispatch Queue时,虽然在一个Serial Dispatch Queue中同时只能执行一个追加处理,但多个Serial Dispatch Queue之间可以并行执行。

通过dispatch_queue_create 函数生成的Dispatch Queue,在使用结束后需要释放。

//释放
dispatch_release(queue);

第二种方式:获取系统标准提供的Dispatch Queue。

Main Dispatch Queue,是在主线程中执行的Dispatch Queue,属于Serial Dispatch Queue。

// 1.获得主队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
追加到Main Dispatch Queue的处理在主线程的RunLoop中执行。因此要将用户界面的更新等一些必须在主线程中执行的处理追加到Main Dispatch Queue使用。与NSObject类的persormSelectorOnMainThread实例方法相同。

Global Dispatch Queue是ConCurrent Dispatch Queue。所有应用程序都可以使用,没有必要通过dispatch_queue_create函数逐个生成Concurrent Dispatch Queue。

// 1.获得全局的并发队列
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
第一个参数表示优先级。Global Dispatch Queue有4个执行优先级,分别是:

#define DISPATCH_QUEUE_PRIORITY_HIGH 2
#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0
#define DISPATCH_QUEUE_PRIORITY_LOW (-2)
#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN

2 执行任务方式

GCD有两种方法执行任务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值