代码之家  ›  专栏  ›  技术社区  ›  Matthew the Coder

ios swift如何为循环skaction使用完成处理程序

  •  0
  • Matthew the Coder  · 技术社区  · 6 年前

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

    程序不会在末尾打印“completed”消息,但该消息将在skactions执行的同时出现。我希望消息只在所有skactions完成后出现。我也试过:

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

    这也不起作用。我好像不能把这件事做好。

    2 回复  |  直到 6 年前
        1
  •  0
  •   Ron Myschuk    6 年前

    我试着在另一个问题中向你解释。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")
    }
    

    这将只在最后一行完成后输出最后一行,因为我们已经等待了必要的时间。

        2
  •  0
  •   Knight0fDragon    6 年前

    运行块会立即触发,并在块完成时完成,而不是在块内的所有操作完成时完成。

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

    如果你计划一个接一个地触发代码,然后有一个完成块,我建议你把所有的动作都放到一个序列动作中。