Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
你的主线是怎样的';s串行队列是否划分其代码?(iOS/Objective-C)_Ios_Grand Central Dispatch - Fatal编程技术网

你的主线是怎样的';s串行队列是否划分其代码?(iOS/Objective-C)

你的主线是怎样的';s串行队列是否划分其代码?(iOS/Objective-C),ios,grand-central-dispatch,Ios,Grand Central Dispatch,为了阐明我的意思,假设我们有一些代码作为某个对象的实例方法,比如一个视图控制器: - (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

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

- (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
第三个块包含

//do bar stuff
//do foo stuff B
还是工作方式不同

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

我们知道

- (void)foo {
    dispatch_sync(dispatch_get_main_queue(), ^{
        //do stuff
    }
}
将导致程序死锁,因为dispatch_sync块永远卡在队列上(或者这不是真的?)。这是我不清楚的部分:在主线程上执行的当前“块”是什么样子的?某些“块”需要完成执行,然后主队列才能将下一个块推送到主线程,对吗?

主线程实际上正在运行类似以下内容的代码(高度简化):

其中“命令”是要执行的回调或块


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

这有点令人困惑,因为您的两个方法及其代码以及它们的执行方式与调用它们的线程或队列无关,也与GCD无关。我同意rmaddy的评论,而且这段代码不会以任何方式被分割。每件事都会在一次连续执行中有序发生(就您而言)。为了实现这一点,您必须实际使用块或其他东西,比如在同一队列上运行异步块会让当前的执行在此线程上完成,然后它会转到您的块,然后再次启动runloop。我试图编辑我的问题以获得更清晰的信息。我没有足够的知识来清楚地表达我想问的问题,所以希望我的编辑就足够了。谢谢!那么,在我的示例中,我们从viewDidLoad内部调用foo,那么主调度队列和线程之间会发生什么呢?消息“CallViewDidLoad”从调度队列中推出,由主线程执行。这个执行是否会导致“callfoo”也被推到队列上?我所困惑的部分是,如果Foo需要在VIELDDIAD加载的中间执行,“调用VIEWDIDLoad”可以完成执行,但是“调用FO”在队列中等待“调用VIELDDILATION”执行。我已经更新了我的术语。主队列根据调度队列命令进行操作;普通函数执行不是命令。只有调度队列命令(例如UI回调、用户提交的调度块等)才能进入调度队列。其他一切都是正常的函数执行。我明白了。因此,在我的示例中出现死锁的原因是因为“viewDidLoad”是一个UI回调,而该回调永远不会完成,因为它正在等待dispatch\u sync?接下来,这是否意味着,如果我们在正常函数执行过程中在主队列上调用dispatch_sync,这不会导致死锁?我想我开始明白我困惑的根源了:我没有区分UI回调和“正常函数执行”。