for-loop - iOS Swift 如何为 For 循环 SKAction 使用完成处理程序
问题描述
我想创建并运行一些 SKAction。在 SKAction 之后,程序将打印一条消息。
let actLoop = SKAction.run {
for i in 1 ... 10 {
self.stone[i - 1].position = CGPoint(x: 0 , y: -100)
self.stone[i - 1].anchorPoint = CGPoint(x: 0.5, y: 0.5)
self.stone[i - 1].size = CGSize(width: 50, height: 50)
self.addChild(self.stone[i - 1])
let actionMove = SKAction.move(to: CGPoint(x: 0, y: 0), duration: 0.3)
let actionRolling = SKAction.animate(with: stone[i - 1].arrayTexture, timePerFrame: 0.05)
let actionSequence = SKAction.sequence([actionMove,actionRolling])
stone[i - 1].run(actionSequence)
}
self.run(actLoop) {
print("Completed")
}
程序最后不会打印“已完成”消息,但该消息将在 SKAction 执行的同时出现。我希望该消息仅在所有 SKAction 完成后出现。我也试过这个:
self.run(actLoop, completion: {
//
print("Completed")
})
这也没有奏效。我似乎无法做到这一点。
解决方案
我尝试在另一个问题中向您解释这一点。for 循环在继续下一项之前不会等待操作完成。for 循环会立即(几乎)处理所有 10 个项目。因此,您遇到的输出是预期的。有很多方法可以做到这一点,但有些方法比其他方法更复杂(即完成块)。最简单的方法就是跟踪 for 循环中的持续时间并等待该持续时间触发完成。
根据您在此处提供的代码,所有 10 个项目同时显示在屏幕上,这与您在此主题上提出的最后一个问题相矛盾。
for x in 0..<10 {
self.run(.wait(forDuration: 1.0)) {
print(x)
}
}
将在代码运行后 1 秒一次在单独的行上打印出 0,1,2,3,4,5,6,7,8,9,因为循环中的所有行都被一次性处理并被告知打印前等待 1 秒。
var delay: double = 1.0
for x in 0..<10 {
self.run(.wait(forDuration: delay)) {
print(x)
}
delay += 1
}
将在打印前一个后 1 秒后在单独的行上打印 0,1,2,3,4,5,6,7,8,9,最后一个总共需要 10 秒才能输出代码运行,因为循环中的行被一次性处理,并被告知在打印前等待更长的时间。
var delay: double = 1.0
for x in 0..<10 {
self.run(.wait(forDuration: delay)) {
print(x)
}
delay += 1
}
self.run(.wait(forDuration: delay)) {
print("all done adding objects")
}
这将仅在最后一行完成后输出最后一行,因为我们已经等待了必要的时间。
推荐阅读
- java - 无法使用java通过rest api从mysql中检索图像
- r - 使用 variogram() 时中止会话致命错误
- sql-server - 如何替换 SQL Server 中的链接服务器调用?
- html - CSS 侧边菜单 - 由无线电输入控制的隐藏子菜单 - 似乎无法正确处理
- cypress - 获取“无法设置只有getter的属性名称”
- reactjs - 在数组的对象中更新和添加特定值?
- go - Go Context Value 和 OpenTracing Baggage Items 有什么区别?
- python - 如何在 Python 中求解带有约束的非线性三元方程?
- python - 创建数据透视表时出现 KeyError
- python-3.x - 模块 posixpath 没有属性“json”