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