你的主线程的串行队列如何划分它的代码? (iOS/Objective-C)

How does your main thread's serial queue divide up its code? (iOS/Objective-C)

为了阐明我的意思,假设我们有一些代码作为某个对象的实例方法,比如一个视图控制器:

- (void)foo {
    //do foo stuff A
    [self bar];
    //do foo stuff B
}
- (void)bar {
    //do bar stuff
}

我们在视图控制器的 viewDidLoad 或其他东西中调用此代码:

[self foo]

代码是否作为一系列块进入主队列,其中第一个块包含

//do foo stuff A

第二个块包含

//do bar stuff

第三块包含

//do foo stuff B

还是它的工作方式不同?

编辑:根据人们告诉我这令人困惑,因为我的代码与 GCD 无关,让我首先澄清是什么让我对此感到疑惑。

我们知道

- (void)foo {
    dispatch_sync(dispatch_get_main_queue(), ^{
        //do stuff
    }
}

将导致程序死锁,因为 dispatch_sync 块永远卡在队列中(或者这不是真的?)。现在这是我不清楚的部分:当前在主线程上执行的 "block" 是什么样子的?有些"block"需要执行完,主队列才能将下一个块推送到主线程,对吧?

"main thread" 实际上是 运行 代码,看起来像这样(大大简化):

while(1) {
    get command off dispatch queue
    execute command off dispatch queue
}

其中 "command" 是回调或要执行的块。

因此,主线程将其工作划分为单独的回调(如 viewDidLoad)。每个回调执行完成后,主线程去处理另一个命令。