【问题标题】:Dispatchqueue background thread update not working on iOS 12Dispatchqueue 后台线程更新在 iOS 12 上不起作用
【发布时间】:2019-02-23 11:21:00
【问题描述】:

我有以下代码在 11.4.1 上完美运行,但在 12 上失败

let background = DispatchQueue(label:"task")
var debugMeshNode = SCNNode()
let myKit = MyKit()

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
    self.background.async {
        let node = self.myKit.extractNode(anchor:anchor)
        self.debugMeshNode.addChildNode(node) // no node added on UI in iOS12
    }
}

func session(_ session: ARSession, didUpdate frame: ARFrame) {
    self.background.async {
        self.myKit.process(frame: frame)
    }
}

谁能指出我的错误?

更新

如果我像这样在块中添加打印语句,代码似乎可以工作,

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
    self.background.async {
        let node = self.myKit.extractNode(anchor:anchor)
        self.debugMeshNode.addChildNode(node) // no node added on UI in iOS12
        print("sample")
    }
}

【问题讨论】:

    标签: swift4 grand-central-dispatch xcode10 ios12 dispatch-queue


    【解决方案1】:

    最初来自here,我用过这个

    func guaranteeMainThreadSynchronousExecution(_ block: () -> ()) {
        if Thread.isMainThread {
            block()
        } else {
            DispatchQueue.main.sync {
                block()
            }
        }
    }
    

    并像这样更新了我的代码,

    func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
        self.guaranteeMainThreadSynchronousExecution {
            self.background.async {
                let node = self.myKit.extractNode(anchor:anchor)
                self.debugMeshNode.addChildNode(node) // no node added on UI in iOS12
            }
        }
    }
    

    然后它完美地工作。希望这对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 2018-11-18
      • 2019-06-22
      • 1970-01-01
      • 2021-09-26
      • 1970-01-01
      • 2015-03-20
      • 1970-01-01
      • 1970-01-01
      • 2012-07-21
      相关资源
      最近更新 更多