For loop iOS Swift如何使用for循环操作的完成处理程序

For loop iOS Swift如何使用for循环操作的完成处理程序,for-loop,swift3,sprite-kit,skaction,completionhandler,For Loop,Swift3,Sprite Kit,Skaction,Completionhandler,我想创建并运行一些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, h

我想创建并运行一些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")

}
程序不会在末尾打印“已完成”消息,但该消息将在SKActions执行的同时出现。我希望消息仅在所有操作完成后显示。我也试过:

    self.run(actLoop, completion: {
        //
        print("Completed")

        })

这也不起作用。我似乎无法正确理解这一点。

我试图用另一个问题向您解释这一点。for循环不会等到操作完成后再继续下一项。for循环瞬间(几乎)处理所有10个项目。因此,您正在体验的输出是预期的。有很多方法可以做到这一点,但有些方法比其他方法更复杂(即完成块)。最简单的方法就是跟踪for循环中的持续时间,并等待该持续时间触发完成

根据您在此处展示的代码,所有10项都同时显示在屏幕上,这与您在本主题上提出的最后一个问题相矛盾

for x in 0..<10 {
    self.run(.wait(forDuration: 1.0)) {
        print(x)
    }
}

对于0中的x..运行块将立即启动,并在块完成时完成,而不是在块内的所有操作完成时完成

即使要在for循环中一个接一个地链接操作,您的run块也会在更新周期结束时完成


如果您计划一个接一个地启动代码,然后执行一个完成块,我建议您将所有操作放入序列操作中。

虽然我同意他没有将您的更改应用到他的最新问题上,但这仍然不能回答实际问题。我不明白这是怎么回事。我向他解释了为什么它不起作用,并给了他一个让它起作用的解决方案。因为他用糟糕的代码分散了你的注意力,但真正的原因是
run(block)
notwaitlol^……我想当我说“for循环不等待”时会暗示这一点,但你是对的。我无意不尊重OP,但我尽量让它尽可能简单。这不是for循环,而是
SKAction.run(block)
才是真正的罪魁祸首。如果他只做了一个对象而不是一个循环,他仍然会有错误,你的答案也不会适用。OP应该使用更新的答案来避免混淆。
var delay: double = 1.0
for x in 0..<10 {
    self.run(.wait(forDuration: delay)) {
        print(x)
    }

    delay += 1
}
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")
}