swift - 如何在 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()
解决方案
你永远不想“等待”。但是您可以设置一个重复计时器来检查某些条件,如果是,则调用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...")
}
}
}
推荐阅读
- python - 无法为等高线图创建卡方表达式
- sql - 是否可以联合两个 EXECUTE BLOCK 语句?
- c# - 使用 SSIS 脚本任务下载 Amazon S3 文件
- php - 从 html 文档中的多个标签中刮取相关的文本对
我在数据库字段中有这个 html 源代码。我想分析这段代码,特别是一些表格的字段,并将它们打印在屏幕上。我无法发布所有代码,因为它超过 3000 行代码,这是代码的开头:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transi
- docker - Docker:在宿主环境中执行脚本
- spring-boot - Thymeleaf 时间和日期与时区
- delphi - 如何将制表符写入 InputQuery?
- docker - 如何使用 Helm 模板解析 .env 文件(dotenv)?
- kubernetes - deployment.yaml 中的环境与命名空间
- python - Pandas - 如何从系列中构建和扩展窗口数据框