我正在尝试在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()
答案 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...")
}
}
}