iOS Swift 如何为 For 循环 SKAction 使用完成处理程序
Posted
技术标签:
【中文标题】iOS Swift 如何为 For 循环 SKAction 使用完成处理程序【英文标题】:iOS Swift How to use completion handler for For loop SKAction 【发布时间】:2018-06-12 16:23:34 【问题描述】:我想创建并运行一些 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")
)
这也不起作用。我似乎无法做到这一点。
【问题讨论】:
【参考方案1】:我尝试在另一个问题中向您解释这一点。 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")
这将仅在最后一行完成后输出最后一行,因为我们已经等待了必要的时间。
【讨论】:
虽然我同意他没有将您的更改应用于他的最新问题,但这仍然不能回答实际问题。 我不明白它是怎么做到的。我向他解释了为什么它不工作,并给了他一个解决方案来让它工作。 因为他用他糟糕的代码分散了你的注意力,但真正的原因是因为run(block)
不等待
lol^...我认为当我说“for 循环不等待”时会暗示这一点,但你是对的。无意不尊重 OP,但我尽量保持简单
这不是 for 循环,而是 SKAction.run(block)
才是真正的罪魁祸首。如果他只完成了 1 个对象而不是循环,他仍然会出现错误,并且您的答案将不适用。 OP 应该使用更新后的答案来避免混淆。【参考方案2】:
运行块立即触发,并在块完成时完成,而不是在块内的所有动作完成时完成。
即使您要在 for 循环中一个接一个地链接您的操作,您的运行块也会在更新周期结束时完成。
如果您计划一个接一个地触发您的代码然后有一个完成块,我建议您将所有操作放入一个序列操作中。
【讨论】:
以上是关于iOS Swift 如何为 For 循环 SKAction 使用完成处理程序的主要内容,如果未能解决你的问题,请参考以下文章
iOS Swift:如何为 Swift 3 进行异步/反应式/事件编程