GCD-----dispatch队列(iOS线程)
2017-09-29 13:43
405 查看
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队列是线程安全的,可以利用串行队列实现锁的功能,比如多线程写同一数据库,需要保持写入的顺序和每次写入的完整性,简单的利用串行队列
dispatch_queue_t myqueue = dispatch_queue_create(“”,DISPATCH_QUEUE_SERIAL);
-(void)writeDB:(NSData *)data{
});
};
下一次调用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
一、队列的生成方式
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
相关文章推荐
- ios 多线程控制线程并发数、GCD之dispatch_group、GCD信号量
- iOS边练边学--GCD的基本使用、GCD各种队列、GCD线程间通信、GCD常用函数、GCD迭代以及GCD队列组
- iOS-线程之GCD方式---之同步异步和串行队列并行队列之间的关系
- IOS GCD线程相关内容(dispatch_sync,dispatch_async)
- dispatch_sync 线程 GCD iOS
- 队列 和 线程 之GCD dispatch
- IOS线程数据篇8之GCD功能使用大全:队列阻塞挂起(一次激活所有阻塞任务)
- GCD:dispatch_sync会在当前线程中执行派发到其他队列的任务
- iOS GCD, 同步,异步,串行队列,并行队列,dispatch_group
- iOS线程开发之--BLOCK & GCD(Grand Central Dispatch)
- iOS中多线程知识总结:进程、线程、GCD、串行队列、并行队列、全局队列、主线程队列、同步任务、异步任务等
- dispatchc 线程 GCD iOS
- iOS中多线程知识总结:进程、线程、GCD、串行队列、并行队列、全局队列、主线程队列、同步任务、异步任务等
- iOS GCD 队列 线程
- iOS应用程序中通过dispatch队列控制线程执行的方法
- iOS NSThreadGCD 线程与队列(二)
- iOS线程开发之--BLOCK & GCD(Grand Central Dispatch)
- iOS并发编程--GCD、操作队列、线程
- iOS中多线程知识总结:进程、线程、GCD、串行队列、并行队列、全局队列、主线程队列、同步任务、异步任务等(有示例代码)
- iOS 多线程编程<三、GCD主队列相关>