iOS Swift Как использовать обработчик завершения для цикла цикла - PullRequest
0 голосов
/ 12 июня 2018

Я хочу создать и запустить SKAction.После SKAction программа напечатает сообщение.

let actLoop = SKAction.run {
for i in 1 ... 10 {

    self.stone[i - 1].position = CGPoint(x: 0 , y: -100)
    self.stone[i - 1].anchorPoint = CGPoint(x: 0.5, y: 0.5)
    self.stone[i - 1].size = CGSize(width: 50, height: 50)
    self.addChild(self.stone[i - 1])   

    let actionMove = SKAction.move(to: CGPoint(x: 0, y: 0), duration: 0.3)
    let actionRolling = SKAction.animate(with: stone[i - 1].arrayTexture, timePerFrame: 0.05)
    let actionSequence = SKAction.sequence([actionMove,actionRolling])
    stone[i - 1].run(actionSequence)
}

self.run(actLoop) {

print("Completed")

}

Программа не напечатает сообщение «Completed» в конце, но сообщение появится примерно в то же время, когда выполняются SKActions.Я хочу, чтобы сообщение появилось только после того, как все SKActions завершены.Я также попробовал это:

    self.run(actLoop, completion: {
        //
        print("Completed")

        })

Это тоже не сработало.Я не могу понять это правильно.

Ответы [ 2 ]

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

Выполнение блоков запускается сразу и завершается после его завершения, а не после завершения всех действий внутри блоков.

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

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

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

Я пытался объяснить это вам в другом вопросе.Цикл for НЕ ожидает завершения действий, прежде чем перейти к следующему пункту.Цикл for обрабатывает все 10 ваших элементов мгновенно (почти).Поэтому ожидаемый результат ожидается.Есть несколько способов сделать это, но некоторые из них более сложны, чем другие (например, блоки завершения).Самый простой способ сделать это - просто отслеживать продолжительность в цикле for и ждать, пока эта продолжительность запустит завершение.

В соответствии с вашим кодом, который вы здесь представили, ВСЕ 10 элементов представлены на экране вв то же время, что противоречит последнему вопросу, который вы задали по этой теме.

for x in 0..<10 {
    self.run(.wait(forDuration: 1.0)) {
        print(x)
    }
}

выведет 0,1,2,3,4,5,6,7,8,9 на отдельных строках сразу за 1 секунду после выполнения кода, потому что все строки вцикл обрабатывается все сразу, и перед печатью предлагается подождать 1 секунду.

var delay: double = 1.0
for x in 0..<10 {
    self.run(.wait(forDuration: delay)) {
        print(x)
    }

    delay += 1
}

выведет 0,1,2,3,4,5,6,7,8,9 на отдельных строкахЧерез 1 секунду после того, как предыдущий был напечатан, а последний выводил всего 10 секунд, чтобы вывести код, потому что строки цикла обрабатываются одновременно и им предписано ждать БОЛЬШЕ длительностей перед печатью.

var delay: double = 1.0
for x in 0..<10 {
    self.run(.wait(forDuration: delay)) {
        print(x)
    }

    delay += 1
}

self.run(.wait(forDuration: delay)) {
    print("all done adding objects")
}

это выведет последнюю строку ТОЛЬКО ПОСЛЕ того, как последняя будет завершена, потому что мы подождали необходимое время.

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