返回
iOS底层-多线程之GCD(中)
IOS
2024-01-28 08:30:11
上篇文章讲了多线程GCD的队列与函数搭配,以及队列的底层的相关内容,那么函数的执行又是怎样的呢,本文将针对函数进行深入分析。
函数的执行
这里函数的执行也就是block块的调用。
GCD中,函数的执行主要有两种方式:同步执行和异步执行。
- 同步执行
同步执行是指函数在当前线程中立即执行,不会开辟新的线程。
// 同步执行
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"同步执行");
});
- 异步执行
异步执行是指函数在新的线程中执行,不会阻塞当前线程。
// 异步执行
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"异步执行");
});
block块的调用
block块是在GCD中执行任务的代码块。block块的调用有以下几种方式:
- 直接调用
block块可以直接在函数中调用。
void (^block)(void) = ^{
NSLog(@"直接调用");
};
block();
- 通过队列调用
block块可以通过队列来调用。
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"通过队列调用");
});
- 通过组调用
block块可以通过组来调用。
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_main_queue(), ^{
NSLog(@"通过组调用");
});
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
block块的执行顺序
block块的执行顺序是由GCD决定的。GCD会根据队列的优先级和block块的依赖关系来决定block块的执行顺序。
队列的优先级
队列的优先级分为高、中、低三种。优先级高的队列会优先执行。
block块的依赖关系
block块之间可以存在依赖关系。一个block块可以依赖于另一个block块,只有当依赖的block块执行完成后,当前block块才能执行。
block块的执行示例
下面是一个block块的执行示例:
// 创建一个串行队列
dispatch_queue_t serialQueue = dispatch_queue_create("com.example.serialQueue", DISPATCH_QUEUE_SERIAL);
// 创建一个并行队列
dispatch_queue_t concurrentQueue = dispatch_queue_create("com.example.concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
// 创建一个组
dispatch_group_t group = dispatch_group_create();
// 将block块添加到串行队列中
dispatch_async(serialQueue, ^{
NSLog(@"串行队列");
});
// 将block块添加到并行队列中
dispatch_async(concurrentQueue, ^{
NSLog(@"并行队列");
});
// 将block块添加到组中
dispatch_group_async(group, dispatch_get_main_queue(), ^{
NSLog(@"组");
});
// 等待组中的所有block块执行完成
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
输出结果如下:
串行队列
组
并行队列
从输出结果可以看出,串行队列中的block块首先执行,然后是组中的block块,最后是并行队列中的block块。