【问题标题】:DispatchWorkItem not notifying main threadDispatchWorkItem 没有通知主线程
【发布时间】:2017-09-29 15:43:44
【问题描述】:

注意:这不是我已经看到Dispatch group - cannot notify to main thread的重复问题

没有关于DispatchWorkItem

的答案

我有如下代码

let dwi3 = DispatchWorkItem {
    print("start DispatchWorkItem \(Thread.isMainThread)")
    sleep(2)
    
    print("end DispatchWorkItem")
}
let myDq = DispatchQueue(label: "A custom dispatch queue")
dwi3.notify(queue: myDq) {
    print("notify")

}
DispatchQueue.global().async(execute: dwi3)

哪个工作正常(我可以在控制台上看到通知)而不是在主线程中 start DispatchWorkItem false

启动 DispatchWorkItem 假

结束 DispatchWorkItem

通知

现在我正在尝试使用通知主线程

dwi3.notify(queue: DispatchQueue.main) {
    print("notify")

}

但它从不调用,我已阅读并发现如果线程被阻塞,则会发生这种情况。但我已经在DispatchQueue.global() 中执行DisptachWorkItem

请任何人都可以帮助我解决实际发生的情况?

【问题讨论】:

  • 您的代码在游乐场和应用程序中都适用于 dwi3.notify(queue: DispatchQueue.main)。你是如何运行代码的
  • 奇怪的是我刚刚在操场上添加了代码但是`dwi3.notify(queue: DispatchQueue.main)`没有工作!!
  • 如果你在操场上跑步,你必须添加import PlaygroundSupportPlaygroundPage.current.needsIndefiniteExecution = true
  • @Paulw11 我添加了屏幕截图
  • sleep(80) 将阻塞主队列。摆脱它并添加我之前评论中的两行。

标签: swift multithreading grand-central-dispatch swift-playground


【解决方案1】:

如果您在 Playground 中运行异步代码,则需要启用无限期执行,否则执行可能会在回调执行之前结束。

将以下行添加到您在操场上的代码中:

import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true

执行此操作后,您将看到通知在主队列上正确执行。

【讨论】:

  • 使用 sleep 但没有运气
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多