当前位置: 首页 > 面试题库 >

global()。async中的main.sync是什么意思?

姬弘文
2023-03-14
问题内容

在Swift中,有时会使用这种模式。

DispatchQueue.global().async {
    // do stuff in background, concurrent thread

    DispatchQueue.main.sync {
        // update UI
    }
}

这种模式的目的很明确。在全局线程中执行耗时的计算,以使UI不会被锁定,并在计算完成后更新主线程中的UI。

如果没有什么要计算怎么办?我刚刚在我的项目中发现了一个逻辑

//A
DispatchQueue.main.sync {
    // do something
}

崩溃但

// B
DispatchQueue.global().async {
    DispatchQueue.main.sync {
        // do something
    }
}

不会崩溃。

它们有何不同?情况 B 与此不同吗?

// C
DispatchQueue.main.async {
    // do something
}

还有一个问题。我知道主线程是串行队列,但是如果我在多个线程中运行多个代码块main.async,它的工作方式就像并发队列。

DispatchQueue.main.async {
    // do A
}

DispatchQueue.main.async {
    // do B
}

如果主线程确实是一个串行队列,那么它们如何同时运行?如果只是时间片,那么它们与全局并发队列有什么不同,除了主线程可以更新UI之外?


问题答案:

x.sync表示调用队列将暂停并等待,直到同步块结束才能继续。因此在您的示例中:

DispatchQueue.global().async {
    // yada yada something
    DispatchQueue.main.sync {
        // update UI
    }
    // this will happen only after 'update UI' has finished executing
}

通常,您不需要sync回到主线程,异步可能足够好并且更安全,可以避免死锁。除非是特殊情况,否则您需要等到main完成后再继续执行异步任务。

至于一个崩溃的例子-
调用同步并以当前队列为目标是一个死锁(调用队列等待同步块完成,但由于目标队列(相同)正忙于等待sync调用而无法启动),这可能是为什么迷恋;撞车;崩溃。

至于使用异步在主队列上调度多个块:它们不会并行运行-
它们将一个接一个地发生。也不要假设队列==线程。将多个块调度到同一队列中,可能会创建系统允许的尽可能多的线程。只是主队列是利用主线程的特殊之处。



 类似资料:
  • 问题内容: 示例A:-这会导致应用崩溃。 范例B:-但事实并非如此 据我所知 x.sync表示在主线程/ UI线程中执行操作,x.async表示在后台线程中执行操作。 全局意味着用并发队列执行某些任务,即并行任务。 任务1:-为什么在后台线程(即main.async)中执行任务时,我的应用程序崩溃了,而不是调用主线程来更新UI。 任务2:-main.async和global()。async是否有任

  • 根据文件, 全局:组件在所有用户之间共享。会话:组件的单独实例提供给每个用户。 这意味着,对于全局组件,整个原子核系统只有一个实例。如果这是真的,那么它对像“/atg/dynamo/transaction/transactionmanager”这样的组件和大多数的液滴如何有效?因为这些组件同时被多个用户使用 编辑: 我理解“TransactionManager”行为。根据定义,应该有一个事务管理器

  • 这在本代码示例中使用https://stackblitz.com/angular/jdamnnmgrae?file=app/autocomplete-概述-example.ts。 有问题的代码段是: 我还没有见过这种语法,所以我很困惑它是做什么的。当我删除异步调用时,代码不再工作,所以我需要理解它。 我相信这段代码正在创建一个被发送到异步管道的可观测对象列表,但是我还没有看到Angular文档中记

  • 问题内容: 我试图在Python 3.3中使用旧的库(可追溯至2003年!)。当我导入它时,Python抛出错误,因为源文件中有符号,例如: 我猜这是该语言现在被放弃的标志。 它到底是什么意思,我应该用哪个(较新的)符号代替? 问题答案: 这意味着不等于。它取自(python的前身)此处: 订单测试(表示 “不等于” ) 我相信它是从Pascal那里获得的,Pascal是Guido开始使用的语言。

  • 问题内容: 我发现此代码可在此处找到SO中的重复项。但我不明白这条线是什么意思 问题答案: 该运算符是Java中无符号的右移位运算符。它有效地将操作数除以右操作数的幂,或者仅在此处。 和之间的差异仅在移动负数时才会显示。如果运算符是a ,则运算符会将其移位到最高有效位,而无论如何都将移位。 更新: 让我们求平均值和()。我们可以轻松地进行数学运算: 现在,通过代码,涉及到以下这些位: 让我们将“转

  • 问题内容: 我已经看到了声明,接口和类 这是什么意思? 问题答案: 没有证据,我相信您在谈论Java的泛型支持… 泛型允许您抽象类型 在Java 5之前,很难提供能够支持多种不同类型的Objects的类而不必为每种特定情况编写代码,因此人们通常会这样做。 这导致在运行时做出许多困难的选择,您必须进行运行时检查以查看是否有可能将给定的Object强制转换为可用类型…例如 现在,这已经很明显了,但是如