Сгруппируйте несколько узлов для действий и получите уведомление после завершения

У меня есть SKNode с детьми. Для этих детей я хотел бы применить действия, которые должны начинаться в одно и то же время (пример кода, k1000ms - константа):

let children = self.children        
for var i=0; i<children.count; i++ {
  children[i].runAction(SKAction.moveTo(CGPoint(x: 0.0, y: 0.), duration: k1000ms))
}

Дело в том, что я не знаю, сколько времени занимает итерация, поэтому запуск действий для огромного количества дочерних элементов может привести к задержке между первым и последним запущенным действием. Решение, очевидно, заключается в том, чтобы сначала применить действия ко всем узлам, а затем запустить действия с помощью одного вызова (надеюсь, ОС позаботится о правильной синхронизации, но это другой вопрос).

Вопрос 1: Как сначала применить действия ко всем узлам, а потом запустить все сразу?

Вопрос 2: Как получить уведомление о том, что все действия выполнены?


person osx    schedule 31.08.2014    source источник


Ответы (1)


1: Вы не можете и не должны. Все действия, начатые (запущенные) в одном кадре с одинаковой продолжительностью, завершатся в одном кадре. Весь ваш цикл for выполняется в одном кадре (если вы не используете многопоточность). Следующий кадр не будет обрабатывать (оценивать) действия и рендерить до тех пор, пока цикл for не завершится.

введите здесь описание изображения

2: Используйте последовательность действия с runblock в качестве последнего действия или используйте блок завершения.

person LearnCocos2D    schedule 31.08.2014
comment
Да, нужно было прочитать это более внимательно, найти решение, которое, надеюсь, продлится. Остается один вопрос: как фреймворк узнает, когда мой код закончил добавлять действия к узлам? - person osx; 31.08.2014
comment
он не знает, он просто запускает обновление сцены, которое запускает ваш код и которое (надеюсь) в конечном итоге завершается. Это нормальный последовательный поток выполнения. - person LearnCocos2D; 01.09.2014