如何在快速while循环中添加DispatchQueue延迟?

时间:2018-12-29 23:20:22

标签: swift sprite-kit

我正在尝试在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 :(得分:3)

您从不想“等待”。但是,您可以设置一个重复计时器以检查某些条件,如果是,则调用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...")
        }
    }

}