返回

iOS底层-多线程之GCD(中)

IOS

上篇文章讲了多线程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块。