GCD-----dispatch队列(iOS线程)

本文详细介绍了GCD(Grand Central Dispatch)中的dispatch队列,包括如何生成串行队列和并发队列,以及如何使用dispatch_get_global_queue获取全局并发队列。同时,文章强调了避免使用dispatch_sync可能导致的死锁问题,并给出了异步执行block的示例。在实际开发中,GCD被用于实现网络请求的多线程模型,以及利用串行队列保证数据库写入的线程安全。此外,还提到了在不同iOS版本下声明dispatch_queue_t属性的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GCD的核心就是dispatch队列,dispatch_block的执行最终都会放进某个队列中进行,它类似NSOperationQueue,但更复杂也,也更有效,结合block实现的GCD会把函数的闭包特性发挥出来

一、队列的生成方式
1、dispatch_queue_t queue = dispatch_queue_create(“lining1.queue”,DISPATCH_QUEUE_SERIAL);生成一个串行队列,队列中的block按照先进先出(FIFO)的顺序执行,在同一个线程中执行,第一个参数是队列的名称,尽量不要重名

2、dispatch_queue_t queue = dispatch_queue_create(“lining2.queue”,DISPATCH_QUEUE_CONCURRENT);生成一个并发的执行队列,block分配到多个线程中执行

3、dispatch_queue_t queue = dispatch_get_global_queue_create(DISPATHC_QUEUE_PRIORITY_DEFAULT,0); 获得程序进程缺省产生的并发队列,可设定优先级来选择三个队列

三个队列不代表三个线程,可能会有更多的线程,并发队列根据实际情况来自动产生合理的线程数,这也就是线程池,也叫线程组

4、dispatch_queue_t queue = dispatch_get_main_queue();
这是获得一个主线程,实际上是一个串行队列,同样无法控制主线程队列的中断或者继续

dispatch_async(queue,^{

block的具体实现

}); 异步执行,函数立即返回

dispatch_sync(queue,^{

block的具体实现

});异步执行block,函数不返回,一直等到block执行完毕编译器会根据实际情况优化代码

* 注意 *
尽量避免使用dispatch_sync,嵌套使用会引起程序死锁
比如

dispatch_sync(queue1,^{

dispatch_sync(queue1,^{

        .......

    });
        .........

});

在实际开发中: 常见的有网络请求数据多线程执行模型

dispatch_aysnc(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{

 子线程中开始网络数据请求

 dispatch_sync(dispatch_get_main_queue(),^{

  在主线程中更新UI

  });

});

dispatch队列是线程安全的,可以利用串行队列实现锁的功能,比如多线程写同一数据库,需要保持写入的顺序和每次写入的完整性,简单的利用串行队列

dispatch_queue_t myqueue = dispatch_queue_create(“”,DISPATCH_QUEUE_SERIAL);

-(void)writeDB:(NSData *)data{

  dispatch_async(myqueue,^{

    写入数据库的操作

});

};

下一次调用writeDB 就必须等到上次调用完成后才能进行,保证他的线程是安全的

要申明一个dispatch的属性,一般只要用strong就好
@property (nonatomic,strong)dispatch_queue_t queue;
但是在ios6之前是assign,需要判断

if OS_OBJECT_USE_OBJECT
@property (nonatomic,strong)dispatch_queue_t queue;
esle
@property (nonatomic,assign)dispatch_queue_t queue;
end if

CGD有两个异步的API

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值