- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
let workerQueue = DispatchQueue(label: "foo")
workderQueue.async {
#code
DispatchQueue.main.async {
#code
workerQueue.async {
#code
}
}
}
let workerQueue = DispatchQueue(label: "foo")
DispatchQueue.main.async {
#code
workerQueue.async {
#code
DispatchQueue.main.async {
#code
}
}
}
可以编写代码片段 1 或片段 2 这样的代码吗?主线程会不会被阻塞?
最佳答案
不,这些模式本身并没有什么“坏”之处。
话虽如此,典型的模式是:
workerQueue.async {
// do something computationally intensive
DispatchQueue.main.async {
// update UI and/or model
}
}
这是因为“我有一些足够密集的东西,我不希望它在主队列上运行(并且对用户体验产生不利影响),但是当我完成后,我需要更新我的 UI 和/或模型。”
您很少有更高级别的嵌套,如您的第一个示例所示,“当我更新完 UI 后,我需要将其他内容分派(dispatch)回我的同一个工作队列”。如果您有这方面的实际示例,也许您可以与我们分享,因为可能有更优雅的重构方法来避免嵌套调度的“塔”,这可能会开始使代码有点难以理解。
在你的第二个例子中,你首先分派(dispatch)到主线程的地方也有点不典型。 (是的,我们偶尔不得不这样做,但这种情况不太常见。)我猜你假设你已经在其他线程上了(尽管并非总是如此)。如果是这种情况,代码期望您在特定线程上,您可能希望明确做出该假设,例如:
func foo() {
dispatchPrecondition(condition: .onQueue(workerQueue))
// do some stuff that should be on the `workerQueue`
DispatchQueue.main.async {
// update UI, etc.
...
}
}
最重要的是,任意级别的嵌套绝对没有问题,特别是如果使用 async
进行嵌套...使用 sync
进行嵌套可能会引发死锁问题,如果你不小心。但从实际情况来看,“ future 的程序员能否阅读这段代码并清楚地推断出最终的行为是什么”,您通常会希望对其进行约束,以免造成混淆。
作为一个实际的例子,我可能正在一些专用功能队列(例如数据库访问队列或图像处理队列)上做一些事情,我可能需要使用另一个同步队列来确保线程安全访问,我可能需要在主队列上进行 UI 更新。但是我通常没有这个三级队列塔,但是,例如,我封装了这些不同的级别以避免混淆(例如,我有一个读写器泛型,它封装了我用于线程的并发队列的细节-安全访问),并且我的代码避免了在任何给定方法中复杂地混合不同类型的调度队列。在任何特定的抽象级别上,我都试图避免一次出现太多不同的队列类型。
关于ios - 构造多级dispatchQueue会不会有什么不好的事情发生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54102721/
dispatch_apply将调度队列作为参数,它允许您选择要在哪个队列上执行 block 。 我的理解是,Swift中的DispatchQueue.concurrentPerform是用来代替dis
我试图了解 Dispatch Sync 和 Dispatch Async,我知道它以 GCD 的同步和异步方式执行。但是当我尝试下面的代码时,它给了我奇怪的场景。 我在 Playground 和同步块
当我在主线程上并尝试 DispatchQueue.main.async 时,它不会使应用程序崩溃,但 DispatchQueue.main.sync 会。为什么会这样? 最佳答案 根据 Docs sy
我一直在用DispatchQueue.main.async长时间执行UI相关操作。 Swift 同时提供 DispatchQueue.main.async和 DispatchQueue.main.sy
我正在阅读教程: https://www.raywenderlich.com/148513/grand-central-dispatch-tutorial-swift-3-part-1 并且遇到了 Q
我试图了解 DispatchQueues 的真正工作原理,我想知道假设 DispatchQueues 有自己的管理线程是否安全?例如,让我们以串行队列为例。在我的理解中——因为它是串行的,新任务只能在
So my goal here is to basically perform a query in a while loop and append results of the query to m
我有一个简单的应用程序,其工作原理如下: 应用加载时使用默认图像 收到点击后,将从列表中加载随机图像 如果 5 秒内没有收到点击,我们将重置回默认图像 我正在尝试使用 DispatchQueue 和
我想为不同的 http 请求设置不同的优先级,并且我希望能够立即停止/暂停一些请求,并在我有一个 High 的请求时只执行其中的一些请求 优先级。我打算使用不同的方法,但现在似乎所有方法都已弃用: 1
我正在异步创建图像,然后在主线程上更新 UI。例如 imageLoadingQueue.async { // Creates a new image, caches it. let n
试图制作线程安全数组,但它不像我预期的那样工作 import Foundation import PlaygroundSupport PlaygroundPage.current.needsIndef
我需要在 Swift 中执行搜索操作,我需要使用 UISearchbar。 在 textDidChange 事件中,我需要调用 Web API,解析响应,然后更新数组,然后开始搜索更新后的数组。 但不
我对 DispatchQueue 东西(包括 DispatchGroups、Qos 等)不是很熟悉。我现在有一个担忧。就像,我有一个 ViewController 被重用于 Android 的 Vie
我正在尝试延迟循环某些内容(只是作为概念证明)这是为了其他目的。但为了简化它,这里有一个例子。 所以在这个例子中,我有一个带有“文本”的字符串,我想循环添加另一个字符串,比方说 10 次。唯一的问题是
我正在尝试创建一个使用 USPS API 获取数据的简单包裹跟踪应用程序。 callRestService 方法成功获取数据,其完成处理程序 serviceCallback(设置 unparsedXm
好吧,我已经经历了大量的问题和答案,我知道对它的理解,但是当我尝试一些代码时,我得到了一些不符合这些理论的结果。 目前我的理解: Sync:一旦 block 内的所有任务都被执行,控制将返回。 异步:
我正在为一个应用程序项目编写一个简单的缓存框架,并在闭包中使用 GCD 和 DispatchQueues 来保存和检索框架中的对象。 在编程时,我一次又一次地质疑自己是否正确地完成了它。这是我正在做的
我有这段代码: DispatchQueue.main.asyncAfter(deadline: .now() + (delay * Double(isDelayAccounted.hashVa
这是一个奇怪的问题,我似乎找不到任何帮助。在 Swift 3 上,尝试调用主线程我尝试使用 DispatchQueue.main.async,但它无法编译。 任何想法都会有所帮助。 最佳答案 试试这段
在 Swift 3 中,创建 DispatchQueue 实例: DispatchQueue(label: String, qos: DispatchQoS,
我是一名优秀的程序员,十分优秀!