一、概念介绍
-任务:要执行的操作,在GCD中一般为block
-队列:用来存放任务,在GCD中成为queue
-并发队列:可以让多个任务并发执行
-串行队列:任务只能一个接一个地执行
二、GCD的使用
1.队列的创建
//用来创建串行队列或者并行队列
dispatch_queue_t
dispatch_queue_create(const char *label, dispatch_queue_attr_t attr);
//用来获得系统提供的全局并发队列
dispatch_queue_t
dispatch_get_global_queue(long identifier, unsigned long flags);
//用来获取系统提供的主队列,主队列的任务只在主线程执行
dispatch_queue_t
dispatch_get_main_queue(void);
2.将任务添加到队列中
任务被添加到队列中后,会被自动取出执行。添加任务到队列主要有同步和异步两种。
//以异步的方式添加任务,函数立即返回,执行函数后面的代码。第一个参数是队列,第二个参数是要执行的block
void
dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
//以同步的方式添加任务,函数要等block执行完才能执行函数后面的代码
void
dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
3.各种队列的执行结果
并发队列,以异步的方式添加任务,可能开启多条线程
//两个任务在不同线程执行
- (void)concurrentQueueAsync{
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
for (int i = 0; i < 10; i++) {
NSLog(@"第一个任务%d,%@",i,[NSThread currentThread]);
}
});
dispatch_async(queue, ^{
for (int i = 0; i < 10; i++) {
NSLog(@"第二个任务%d,%@",i,[NSThread currentThread]);
}
});
}
串行队列,以异步的方式添加任务 ,开启一条线程
//任务按顺序执行,且任务不在主线程执行
- (void)serialQueueAsync{
dispatch_queue_t queue = dispatch_queue_create("com.example.myqueue", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
for (int i = 0; i < 10; i++) {
NSLog(@"第一个任务%d,%@",i,[NSThread currentThread]);
}
});
dispatch_async(queue, ^{
for (int i = 0; i < 10; i++) {
NSLog(@"第二个任务%d,%@",i,[NSThread currentThread]);
}
});
}
并发队列,以同步的方式添加任务,不开线程
//任务按顺序执行,并且任务都在主线程执行
- (void)concurrentQueueSync{
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_sync(queue, ^{
for (int i = 0; i < 10; i++) {
NSLog(@"第一个任务%d,%@",i,[NSThread currentThread]);
}
});
dispatch_sync(queue, ^{
for (int i = 0; i < 10; i++) {
NSLog(@"第二个任务%d,%@",i,[NSThread currentThread]);
}
});
}
串行队列,以同步的方式添加任务, 不开线程
//任务按顺序执行,并且任务都在主线程执行
- (void)serialQueueSync{
dispatch_queue_t queue = dispatch_queue_create("com.example.myqueue", DISPATCH_QUEUE_SERIAL);
dispatch_sync(queue, ^{
for (int i = 0; i < 10; i++) {
NSLog(@"第一个任务%d,%@",i,[NSThread currentThread]);
}
});
dispatch_sync(queue, ^{
for (int i = 0; i < 10; i++) {
NSLog(@"第二个任务%d,%@",i,[NSThread currentThread]);
}
});
}
主队列,以异步的方式添加任务,任务在主线程执行。
主队列,以同步的方式添加任务,造成死循环。
原因:dispatch_sync函数在等待任务执行完才能返回,而任务被添加在主队列,也就是任务要等待函数返回了才能执行,相互等待。。。