文章内容和排版参考: iOS 多线程: [GCD]详尽总结
GCD - 核心概念: 任务 | 队列
任务: 就是指需要执行的代码, 在block中编写,有 同步执行 和 异步执行 两种方式. 举例:
同步执行 -- 小时候爸妈说吃饭的时候不能看电视,要先吃完饭,才能去看电视,
异步执行 -- 一边吃饭一边看电视,还可以同时做其他的事情.
- 同步执行(sync) -- 使用 dispatch_sync(queue,^{需要执行的代码})
- 在任务执行完之前会一直等待,直到队列里的任务完成之后再执行
- 不会开启新的线程,只在当前线程执行
- 异步执行(async) -- 使用 dispatch_async(queue,^{需要执行的代码})
- 不会等待,可以直接执行任务
- 会开启新的线程,可以在新的线程中执行
队列(Queue): 执行任务的等待队列, 用于存放任务, 有串行队列 和 并发队列
- 串行队列(Serial)
- 任务只能一个接一个的执行(食堂只有一个窗口,多个人需要排队买饭)
- 主队列是特殊的串行队列(获取主队列:dispatch_get_main_queue())
- 并发队列(Concurrent )
- 多个任务可以同时执行(食堂开启多个窗口,多个人可以同时买饭)
- 全局并发队列是并发队列(dispatch_get_global_queue())
GCD - 使用
在没有详细学习的时候,对GCD的使用总是很混乱,每次都要百度. 在使用时只需要记住: 创建队列、创建任务.
1. 创建队列
dispatch_queue_t queue = dispatch_queue_create("test1", DISPATCH_QUEUE_CONCURRENT);
说明: 参数1 是队列唯一标识符(可以为空),参数二是队列类型,SERIAL(串行队列), CONCURRENT(并发队列)
2. 创建任务
2.1 创建同步执行 + 串行队列
- (void)testSerial {
dispatch_queue_t queue = dispatch_queue_create("test1", DISPATCH_QUEUE_SERIAL);
// 同步任务
dispatch_sync(queue, ^{
[NSThread sleepForTimeInterval:3.0];
NSLog(@"执行block");
});
NSLog(@"执行结束");
}
2.2 创建异步执行 + 并发队列
- (void)testConcurrent {
dispatch_queue_t queue = dispatch_queue_create("test2", DISPATCH_QUEUE_CONCURRENT);
// 异步任务
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:3.0];
NSLog(@"执行block");
});
NSLog(@"执行结束");
}
3. 执行结果对比
同步 + 串行(图1)
异步 + 并行(图2)
效果说明:
图1中在3s后打印了执行block和执行结束;
图2中先打印了执行结束再在3S后打印了执行block.
可以发现同步任务需要将block中的代码执行完再接着往下执行其他代码,但是异步任务在执行block的同时,下面的代码也会执行.
任务和队列的组合方式有6种,可以在文章开头的参考文章内查看