从针对另一个调度队列的主线程发出dispatch_sync时,主队列/主线程会发生什么情况?

智能家居

假设我在主线程上调用下面的方法。如果在调用该方法时其他线程正在对该数组执行写操作,则dispatch_sync将阻塞。但是它阻塞在另一个队列(不是主队列)上。当此状态被阻止时,主队列上的状态是什么(方法不能向前移动,直到disaptch_sync返回,但是将其视为对主队列的异步调用)。例如:主队列会响应UI事件吗?如果是,当对用户事件的反应发生时,dispatch_sync返回时,方法调用的状态将如何处理?

-(id) objectAtIndex:(NSUInteger)index
{
    __block id obj;
    dispatch_sync(self.dataAccessQ, ^{
        obj = self.embeddedArray[index];
    });
    return obj;
}
rmaddy

不管是不是主队列。无论用于呼叫的队列是什么,objectAtIndex:都会阻塞该dispatch_sync呼叫,直到完成。

如果在主队列上调用此代码,则它将像其他队列一样阻塞。在此期间,不会处理任何用户事件。在此期间,用户界面将显示为已锁定。完成后,UI将再次正常运行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我们需要在另一个队列上使用dispatch_sync()而不是在iOS GCD中使用当前队列/线程

调度队列块主线程

GCD主队列和主线程有什么区别?

在主线程上发生到后台队列的dispatch_sync(防止在后台线程上设置后台托管对象上下文)

关于lua协程的问题:为什么当另一个线程让步时主线程不继续运行?

为什么主线程在继续之前要等待另一个线程完成?

从另一个线程调用方法时,主线程被阻塞

为什么在使用DISPATCH_QUEUE_PRIORITY_BACKGROUND时dispatch_sync在主线程上进行工作?

dispatch_sync()总是在主线程中执行块

使用可调用对象时主线程会发生什么

当主线程退出时协程会发生什么?

调度到并发队列导致在主线程上执行?

Matlab:当主线程继续执行主要任务时,如何分叉另一个线程来加载数据?

从另一个线程在主线程中运行代码

如何从C#中的另一个线程在主线程中设置变量?

即使在另一个线程上调用subscribeOn(),也可以在主线程上运行

如何在Java中将对象从主线程传递到另一个线程

如何安全地从另一个线程检查主线程标志?

从另一个线程访问主线程的局部变量

检查主线程是否仍在另一个线程中

在等待另一个线程完成工作时取消阻塞主线程

从另一个线程调用主线程中的函数?

在主线程中保留某个进程,直到另一个线程完成其任务

另一个线程休眠后移动到主线程

如果在文件从一个文件系统(ext4)移至另一个(NTFS)时删除文件,会发生什么情况?

当我在Clojure中从多个线程定义一个变量时会发生什么情况?

dispatch_sync不适用于主队列

C ++线程:如何使用lambda函数将主线程中的参数传递给另一个线程

如何在主线程中调用一个方法并终止另一个线程?