主线程的串行队列如何划分其代码?(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块永远卡在队列上(或者这不是真的吗?)现在这是我不清楚的部分:当前在主线程上执行的"块"看起来像什么?一些"块"需要在主队把下一个块推到主线程之前完成执行,对吗?

"主线程"实际上运行的代码看起来像这样(高度简化):

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

其中的"command"是一个回调函数或要执行的块。

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

最新更新