首页 > 解决方案 > 如何在 swift while 循环中添加 DispatchQueue 延迟?

问题描述

我正在尝试在 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()

标签: swiftsprite-kit

解决方案


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

}

推荐阅读