GCD的队列
- 串行队列:加入到里面的任务是一个一个有顺序的调度的。
串行队列,同步任务
特点:有顺序的执行,并且不会开辟新线程,就在当前线程执行
应用场景:FMDB,它为什么要设计成串行队列,同步任务,为了保证数据的安全-
串行队列,同步任务
特点:有顺序的执行,并且在开辟的新的线程中执行,并且只开一条线程!!!
应用场景:耗时操作,并且有严格先后顺序
去付费网站上,下载片登录--->付费--->下载
- (void)serialSync{
//1.任务
void (^task1) () = ^(){
NSLog(@"task1---%@",[NSThread currentThread]);
};
void (^task2)() = ^() {
NSLog(@"task2---%@",[NSThread currentThread]);
};
void (^task3)() = ^() {
NSLog(@"task3---%@",[NSThread currentThread]);
};
//2.队列
/**
参数1:队列的名称,方便调试,一般是公司域名倒写
www.fichfit.cn
cn.fichfit
参数2:队列的类型,如果创建是串行队列,还可以写NULL
*/
dispatch_queue_t serailQueue = dispatch_queue_create("cn.itcast.serialA", DISPATCH_QUEUE_SERIAL);
//3.将任务加入到队列中,同步的执行
dispatch_sync(serailQueue, task1);
dispatch_sync(serailQueue, task2);
dispatch_sync(serailQueue, task3);
}
打印结果
- (void)serialAsync{
//1.任务
void (^task1) () = ^(){
NSLog(@"task1---%@",[NSThread currentThread]);
};
void (^task2)() = ^() {
NSLog(@"task2---%@",[NSThread currentThread]);
};
void (^task3)() = ^() {
NSLog(@"task3---%@",[NSThread currentThread]);
};
//2.队列
/**
参数1:队列的名称,方便调试,一般是公司域名倒写
参数2:队列的类型,如果创建是串行队列,还可以写NULL
*/
dispatch_queue_t serailQueue = dispatch_queue_create("cn.itcast.serialA", DISPATCH_QUEUE_SERIAL);
//3.将任务加入到队列中,异步的执行
dispatch_async(serailQueue, task1);
dispatch_async(serailQueue, task2);
dispatch_async(serailQueue, task3);
}
打印结果:
-
并发队列:
特点:
任务可以同时执行,这样可以提高程序的运行效率.并发队列,同步任务
特点:没有开辟新线程,同时是按照顺序
应用场景:开发中几乎不用并发队列,异步任务
特点:会开线程,开N条,表示不固定,因为我们的线程循环利用的功能 没有顺序.
应用场景:
比如下载多部片
- (void)concurrentSync{
//1.任务
void(^task1)() = ^() {
NSLog(@"task1---%@",[NSThread currentThread]);
};
void(^task2)() = ^() {
NSLog(@"task2---%@",[NSThread currentThread]);
};
void(^task3)() = ^() {
NSLog(@"task3---%@",[NSThread currentThread]);
};
//2.队列,并发队列,必须自己写,不能写NULL
dispatch_queue_t concurrentQueue = dispatch_queue_create("cn.fichfit.concurrentQueueA", DISPATCH_QUEUE_CONCURRENT);
//3.要把任务和队列绑定起来,同步的去执行
dispatch_sync(concurrentQueue, task1);
dispatch_sync(concurrentQueue, task2);
dispatch_sync(concurrentQueue, task3);
}
打印结果:
- (void)concurrentAsync{
//1.任务
void(^task1)() = ^() {
NSLog(@"task1---%@",[NSThread currentThread]);
};
void(^task2)() = ^() {
NSLog(@"task2---%@",[NSThread currentThread]);
};
void(^task3)() = ^() {
NSLog(@"task3---%@",[NSThread currentThread]);
};
//2.队列,并发队列,必须自己写,不能写NULL
dispatch_queue_t concurrentQueue = dispatch_queue_create("cn.fichfit.concurrentQueueA", DISPATCH_QUEUE_CONCURRENT);
//3.要把任务和队列绑定起来,异步的去执行
dispatch_async(concurrentQueue, task1);
dispatch_async(concurrentQueue, task2);
dispatch_async(concurrentQueue, task3);
}
打印结果:
-
全局队列:
和并发队列,执行效果一样,只是说,并发队列,需要我们程序员,自己创建
而全局队列,是由于系统提供特点: 任务可以同时执行,这样可以提高程序的运行效率.
全局队列,同步任务
特点:没有开辟新线程,同时是按照顺序
应用场景:开发中几乎不用全局队列,异步任务
特点:会开线程,开N条,表示不固定,因为我们的线程循环利用的功能 没有顺序.
应用场景:
比如下载多部片
- (void)gcdDemo3
{
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//全局队列+同步任务
for (int i = 0; i < 10; ++i){
//同步任务
dispatch_sync(queue, ^{
NSLog(@"%@ %d",[NSThread currentThread],i);
});
}
}
打印结果
- (void)gcdDemo3
{
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//全局队列+异步任务
for(int i = 0; i < 10; ++i){
dispatch_async(queue, ^{
NSLog(@"%@ %d",[NSThread currentThread],i);
});
}
}
打印结果
主队列(
奇葩
):
特点:
它永远在主线程工作,这个是苹果给开发人员,提供,回到主线程做事的一种机制主队列,同步任务
特点:主队列,只有在主线程空闲
的时候,才能调度里面的任务
造成死锁主队列,异步任务
应用场景:
回到主线程做事,一般是做和UI相关的工作.
- (void)mainSync{
NSLog(@"%s",__func__);
//1.任务
void(^task1)() = ^() {
NSLog(@"%@----task1",[NSThread currentThread]);
};
void(^task2)() = ^() {
NSLog(@"%@----task2",[NSThread currentThread]);
};
void(^task3)() = ^() {
NSLog(@"%@----task3",[NSThread currentThread]);
};
//2.队列,获取系统提供的主队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
//3.将任务添加到队列,将这二者绑定,同步的执行
dispatch_sync(mainQueue, task1);
dispatch_sync(mainQueue, task2);
dispatch_sync(mainQueue, task3);
}
- (void)mainAsync{
NSLog(@"mainAsync %s",__func__);
//1.任务
void(^task1)() = ^() {
NSLog(@"%@----task1",[NSThread currentThread]);
};
void(^task2)() = ^() {
NSLog(@"%@----task2",[NSThread currentThread]);
};
void(^task3)() = ^() {
NSLog(@"%@----task3",[NSThread currentThread]);
};
//2.队列,获取系统提供的主队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
//3.将任务添加到队列,将这二者绑定,异步的执行
dispatch_async(mainQueue, task1);
dispatch_async(mainQueue, task2);
dispatch_async(mainQueue, task3);
}
<h2>总结:任务的优先级比队列优先级高,所以我们在队列和任务的各种组合的时候,首先要看我们的任务.</h2>
- 1.开不开线程,由任务决定
- 异步才有开辟线程的能力,同步没有开辟线程的能力
- 异步是在其它线程上执行,同步,在当前线程上执行.
- 2.在开发中,主队列比较奇葩,主队列,就是苹果提供给我们,快速回到主线程的种实现机制.