SpriteKit: запускать код или блокировать при удалении действия?

Функция run для SKNode позволяет запускать блок после завершения действия , но что делать, если действие отменено/удалено через removeAllActions?

Отмена действия не вызывает блок завершения из функции run.

Есть ли обратный вызов или способ запуска кода, когда действие отменено/удалено?


person Crashalot    schedule 13.06.2017    source источник
comment
Не то, чтобы я мог думать без пользовательских функций .run и .remove   -  person Fluidity    schedule 14.06.2017
comment
Зачем вам вызывать код при удалении действия? По выбору дизайна вы, вероятно, захотите, чтобы объект, который фактически выполняет удаление, вызывал действие удаления, иначе вы можете оказаться в ситуации, когда вам нужно удалить действие без запуска кода, но вы вынуждены это делать.   -  person Knight0fDragon    schedule 15.06.2017
comment
@Knight0fDragon для сброса узлов, свойства которых были изменены действиями. Было бы чище, чтобы блок завершения вызывался, когда действие отменено, а также завершено (аналогично animateWithDuration в UIView)   -  person Crashalot    schedule 15.06.2017
comment
@Crashalot, опять же, это должен быть метод, вызывающий удаление, вроде того, на что похож ответ Симоны, только немного измененный. Это сложная проблема для размышления, поэтому я не хочу просто публиковать ответ.   -  person Knight0fDragon    schedule 15.06.2017


Ответы (2)


Да, если вы удалите действие до его завершения, блок завершения не запустится. Согласно документам:

Метод run(:completion:) идентичен методу run(:), но после завершения действия вызывается ваш блок. Этот обратный вызов вызывается только в том случае, если действие выполняется до завершения. Если действие удаляется до его завершения, обработчик завершения никогда не вызывается.

person rmp    schedule 13.06.2017
comment
Извините, плохо сформулированный вопрос. :) Да, как указано в вопросе, понятно, что блок завершения не запускается. Вопрос, который не был понятен ранее (извините!), заключается в том, как вы можете запустить код или какой-то блок, когда действие отменяется/удаляется? - person Crashalot; 14.06.2017
comment
Ок, понял. Поэтому в этом случае вы можете посмотреть на именованные действия. С именованными действиями вы можете использовать action(forKey:) в качестве проверки перед removeAllActions, чтобы увидеть, что конкретное действие выполняется. Это так, вы можете выполнить любое действие, которое вам нужно, прежде чем вызывать removeAllActions - person rmp; 14.06.2017

Обходной путь может быть:

class YourSpriteNode: SKNode {

     func doSometingAtCompletionAction() {
          //all your stuff
     }

     override removeAllActions() {
         super.removeAllActions()
         doSometingAtCompletionAction()
     }
}
person Simone Pistecchia    schedule 14.06.2017