Обновление фонового потока диспетчера очереди не работает на iOS 12 - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть следующий фрагмент кода, который отлично работает на 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")
    }
}

1 Ответ

0 голосов
/ 10 октября 2018

Первоначально из здесь , я использовал это

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
        }
    }
}

Тогда он работает безупречно.Надеюсь, это кому-нибудь поможет.

...