为了澄清我的意思,假设我们有一些代码作为某个对象的实例方法,比如一个视图控制器:
- (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
)。在每个回调执行并完成后,主线程去处理另一个命令。