Блоки завершения для последовательностей параллельных операций SKA во вложенных циклах for? - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь запустить набор SKActions в цикле "for", как показано в коде ниже.Последовательность должна выполняться следующим образом:

Для 1-го суперНода ...

  1. Запустить открытие действий на всех дочерних подузлах одновременно;КОГДА СДЕЛАНО ...
  2. Запускайте variableDurationActions для всех дочерних узлов spriteNodes одновременно;КОГДА СДЕЛАНО ...
  3. Одновременно запускается закрывающее действие на всех дочерних подузлах И В ТО ЖЕ ВРЕМЯ ...

Для второго суперузла ...

Одновременно запустить открытие действия на всех дочерних подузлах;КОГДА СДЕЛАНО ...

И этот трехэтапный процесс повторяется для каждого супер-узла.

Первая проблема заключается в том, что, хотя я мог бы написать закрытие, чтобы дождаться завершения одного действияпрежде чем начинать другое, я не знаю, как это сделать для нескольких одновременных действий через циклы «for».Эта проблема возникает между шагами 1 и 2 и шагами 2 и 3. Между 2 и 3 это еще хуже, потому что продолжительность действий на шаге 2 может сильно различаться.

Вторая проблема заключается в том, что я надеваюне знаю, как написать обработчик завершения или какой-то эквивалент, чтобы закрытие выполнялось и следующая итерация открывающая операция выполнялась одновременно, но до переменной DurationActions на следующей итерации.

То, что я пытаюсь сделать, даже возможнос инструментами SpriteKit?Или я должен вместо этого использовать группы рассылки?Я ищу элегантные решения, потому что мой код достаточно сложен, как он есть.

for superNode in scene.children {

    for subNode in superNode.children {

        // All openingActions should run first
        subNode.run(openingAction)

            for spriteNode in subNode.children {

                // These variableDurationActions should run concurrently, second
                spriteNode.run(variableDurationAction)
            }

        // All closingActions should run third AND
        // concurrently with the openingActions in the next iteration
        subNode.run(closingAction)
    }
}

1 Ответ

0 голосов
/ 13 июня 2018

В конечном итоге я нашел решение, разделив временные этапы обработки, создав группу отправки с двумя контрольными точками, и заставив основную функцию (внизу, внизу) перебирать супер-узлы, вызывая себя.

Это кажется мне немного неуклюжим, но вот как это выглядит:

let dispatchGroup = DispatchGroup()

// Step 1
func runOpeningActions() {
    for subNode in superNode.children {
        dispatchGroup.enter()
        // All openingActions should run concurrently, first
        subNode.run(openingAction) { 
            dispatchGroup.leave() 
        }
    }
}

// Step 2
func runVariableDurationActions {
    for subNode in superNode.children {
        dispatchGroup.enter()
        for spriteNode in subNode.children {
            // These variableDurationActions should run concurrently, second
            spriteNode.run(variableDurationAction) {
                dispatchGroup.leave()
            }
        }
    }
}

// Step 3 – to run concurrently with the next Step 1
func runClosingActions() {
    for subNode in superNode.children {
        dispatchGroup.enter()
        // All closingActions should run concurrently, third AND
        // concurrently with the openingActions in the next iteration
        subNode.run(closingAction) { 
            dispatchGroup.leave() 
        }
    }
}

var nodeIndex = 0

// Main function – iterates over Steps 1, 2, and 3
func runAllActions() {
    let superNode = scene.children[nodeIndex]
    runOpeningActions()
    dispatchGroup.notify(queue: .main) {
        runVariableDurationActions()
        dispatchGroup.notify(queue: .main) {
            runClosingActions()
            nodeIndex += 1
            if nodeIndex < scene.children.count {
                runAnimation()
            } else {
                // No more superNodes to process; leave the function
            }
        }
    }
}

// Main function call
runAllActions()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...