У меня возникли проблемы с пониманием того, как очереди отправки или обработчики задач работают в swift 3. Моя конкретная проблема: у меня проблемы с производительностью, и я хочу запускать несколько блоков кода параллельно и ждать выхода из функции, пока все блоки не будут завершены. Я попытался просто запустить блоки асинхронно в фоновом режиме, но затем я получаю «попытку использовать xxx во время его мутации», потому что я перечисляю одни и те же массивы или enumerateChildNodes(...), управляемые в асинхронных очередях. Я пытаюсь минимизировать количество узлов SpriteKit, чтобы улучшить частоту кадров. Вот пример блоков кода, которые я хочу запустить параллельно, и они ждут:
func determinePlatformNodesToUse() {
// Code Block 1:
for platform in platformArray {
addPlatformNode(platform, leftDistance: leftDistance, rightDistance: rightDistance)
}
// Also part of Code Block 1:
// resort the platform nodes to guarantee position sequence
currentPlatformNodeArray.sort(by: { $0.position.x < $1.position.x })
// Code Block 2:
for character in characterArray {
if character.type == CharacterType.Enemy {
addCharacterNode(character, leftDistance: leftDistance, rightDistance: rightDistance)
}
}
// Code block 3
// put all the enemies into an array for update processing will be added in addCharacterNode
currentMotionEnemyNodeArray.removeAll()
// Also part of Code block 3
foregroundNode.enumerateChildNodes(withName: CharacterType.Enemy.rawValue, using: {
(node, stop) in
if let enemy = node as? CharacterNode {
if enemy.motionType != .Stand { // dont use .Stand as they dont have motion
self.currentMotionEnemyNodeArray.append(enemy)
}
}
})
// Code Block 4
for actionSceneObject in actionSceneObjectArray {
addActionSceneObjectNode(actionSceneObject, leftDistance: leftDistance, rightDistance: rightDistance)
}
// At this point, wait until all blocks 1-4 above have finished
// Run blocks 5 - 8 code in all in parallel
// wait until blocks 5 - 8 have finished and then leave the function
}