2

I have the following piece of code that works perfectly on 11.4.1 but fails on 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)
    }
}

Could anyone point my mistake here?

UPDATE

The code seems to work if I add a print statement in the block like so,

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")
    }
}
Pavan K
  • 4,085
  • 8
  • 41
  • 72

1 Answers1

0

Originally from here, I used this

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

and updated my code like so,

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

Then it works flawlessly. Hope this helps someone.

Pavan K
  • 4,085
  • 8
  • 41
  • 72