Удаление узлов SCNNode из scene.rootNode вызывает сбой в SceneKit - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь удалить множество узлов из моей сцены, которые представляют путь. Они представляют собой комбинацию геометрических узлов SCNSphere и пользовательской геометрии, представляющей линии, созданные с использованием SCNGeometrySource и SCNGeometryElement.

Я не сохраняю эти узлы в любом виде массива. Вместо этого я выполняю поиск этих узлов по первому уровню дерева узлов корневого узла в сцене по их имени, а затем вызываю последовательность действий, которая приводит к их исчезновению, и они должны удалить себя из корневого узла.

Код выглядит следующим образом:

func clearPath() {
    //
    let disappear = SCNAction.fadeOut(duration: 0.1)
    let remove = SCNAction.removeFromParentNode()
    let sequence = SCNAction.sequence([disappear, remove])

    if let pathNodesToRemove = pathNodes() {
        //
        for node in pathNodesToRemove {
            //
            node.removeAllActions()
            node.runAction(sequence)
        }
    }

    if let lineNodesToRemove = lineNodes() {
        for node in lineNodesToRemove {
            //
            node.removeAllActions()
            node.runAction(sequence)
        }
    }

    path.removeAll()
}

где:

func pathNodes() -> [SCNNode]? {
    //

...        

    let nodes = rootNode.childNodes.filter { (node) -> Bool in
        //
        guard let name = node.name else { return false }
        if name.hasPrefix(configurationComponent.id) &&
            name.range(of:"_PATH") != nil {
            return true
        } else {
            return false
        }
    }

    return nodes
}

Функция lineNodes () в основном такая же.

Я включил Zombie Objects, чтобы отслеживать, откуда исходит ошибка, и всегда получаю одну и ту же ошибку: ссылку на SceneKit`C3DNodeRemoveFromParentNode в качестве последней вещи, вызываемой в потоке, и EXC_BAD_ACCESS (code = 1, address ...).

Функция clearPath () - единственное место во всем приложении, которое я называю «RemoveFromParentNode».

Узлы не имеют физических тел на них и не хранятся в другом месте.

Есть мысли, как решить эту проблему?

РЕДАКТИРОВАТЬ 28/4/18:

Вот отчет о сбое потока, в котором он произошел. Похоже, что removeObjectFromChildNodesAtIndex вызывается дважды ...

    Thread 9 name:  Dispatch queue: com.apple.scenekit.renderingQueue.Air_Relay.ARTCSCNView0x104126720
Thread 9 Crashed:
0   SceneKit                        0x00000001957d668c C3DNodeRemoveFromParentNode + 40
1   SceneKit                        0x0000000195826e28 -[SCNNode __removeObjectFromChildNodesAtIndex:] + 184
2   SceneKit                        0x0000000195826e28 -[SCNNode __removeObjectFromChildNodesAtIndex:] + 184
3   SceneKit                        0x0000000195827350 -[SCNNode removeFromParentNode] + 396
4   SceneKit                        0x000000019593e9fc -[SCNActionRemove updateWithTarget:forTime:] + 92
5   SceneKit                        0x0000000195907cb8 SCNCActionSequence::cpp_updateWithTargetForTime+ 2202808 (SCNNode*, double) + 316
6   SceneKit                        0x00000001957bcfb0 SCNActionApply + 112
7   SceneKit                        0x0000000195853d2c _applyActions + 236
8   CoreFoundation                  0x00000001814dccbc __CFDictionaryApplyFunction_block_invoke + 24
9   CoreFoundation                  0x00000001814c3f98 CFBasicHashApply + 132
10  CoreFoundation                  0x00000001814cdb64 CFDictionaryApplyFunction + 288
11  SceneKit                        0x0000000195853b5c C3DAnimationManagerApplyActions + 92
12  SceneKit                        0x000000019583b054 -[SCNRenderer _update:] + 656
13  SceneKit                        0x000000019583d018 -[SCNRenderer _drawSceneWithNewRenderer:] + 252
14  SceneKit                        0x000000019583d69c -[SCNRenderer _drawScene:] + 84
15  SceneKit                        0x000000019583daa0 -[SCNRenderer _drawAtTime:] + 728
16  SceneKit                        0x00000001958e446c -[SCNView _drawAtTime:] + 512

РЕДАКТИРОВАТЬ 30/04/18

Я продолжал добавлять другие функции в приложение, где мне нужно было удалять узлы с помощью SCNAction.removeFromParentNode (). Я также выделил их, чтобы вызвать проблему независимо от приведенного выше кода.

Они вызываются чаще при обновлении SCNRendererDelegate при создании каждого нового узла.

Я также попытался использовать removeFromParentNode () непосредственно на узле, используя блок SCNAction.run, и возникает та же проблема.

...