Как добавить задержку DispatchQueue в цикле swift while? - PullRequest
0 голосов
/ 30 декабря 2018

Я пытаюсь создать задержку внутри цикла while.Я довольно новичок в этом, и в настоящее время он просто не работает.Он никогда не срабатывает ни разу с задержкой отправки, но если я уберу задержку, он срабатывает повторно.

По сути, я проверяю, движется ли скорость узлов в SKScene, если они все еще движутся, не заканчивайте игру.Но как только они замедлились, закончите игру.

func RemainingNodeCheck (complete:() -> Void) {

    CountVelocites()

    if (IdleVelocity.max()!.isLess(than: 1.0)) {
        complete()
    } else {

    print("Velocity too high, begin wait...")

      while !(IdleVelocity.max()?.isLess(than: 1.0))! {

                DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + .seconds(1)) {
                    print("Second passed")
                    self.CountVelocites()
                }

            if (IdleVelocity.max()!.isLess(than: 1.0)) {
                break
            }
        }

        print("Velocity Calmed down")
        complete()
    }

}

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

ОБНОВЛЕНИЕ: Я бы использовал таймер, но RemaingNodeCheck вызывается издругая часть, и она ожидает, пока RemainingNodeCheck отправит обратно complete ()

1 Ответ

0 голосов
/ 30 декабря 2018

Вы никогда не хотите «ждать».Но вы можете установить повторяющийся таймер, который проверяет наличие каких-либо условий и, если это так, вызывает закрытие complete (если хотите, таймер становится недействительным).Например,

class ViewController: UIViewController {

    var idleVelocity: ...

    weak var timer: Timer?

    deinit {
        timer?.invalidate()
    }

    func startCheckingVelocity(complete: @escaping () -> Void) {
        timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { [weak self] timer in
            guard let self = self, let maxVelocity = self.idleVelocity.max() else { return }

            if maxVelocity < 1 {
                timer.invalidate()
                complete()
                return
            }

            print("velocity too high...")
        }
    }

}
...