斯威夫特为什么我的NSTimer不能均匀点火?

时间:2016-01-10 22:15:54

标签: ios swift nstimer

我有一个名为arc4random_uniform()的函数,每次NSTimer发出激活时都会调用它(设置为2秒间隔)。目标是每2秒将球颜色更改为随机颜色,而不连续重复两种颜色。除了颜色几乎立即变化,有时需要4秒才能改变。当需要更长时间更改时,我注意到在xcode调试器中,在颜色变化之前,CPU使用率会瞬间达到99%。 func changeBallColor() { var previousint: UInt32? var randint = arc4random_uniform(4) while previousint == randint { randint = arc4random_uniform(4) } previousint = randint if previousint == 0 { imageBall.image = UIImage(named: "circle_g.png") } else if previousint == 1 { imageBall.image = UIImage(named: "circle_b.png") } else if previousint == 2 { imageBall.image = UIImage(named: "circle_r.png") } else if previousint == 3 { imageBall.image = UIImage(named: "circle_y.png") } } 需要一段时间才能完成或某事(在使用while循环的情况下)吗?如果是这样,我如何优化此代码以使其运行完美?对不起,对于Swift来说,我是一个菜鸟。

{{1}}

1 个答案:

答案 0 :(得分:2)

我对CPU峰值没有任何解释,但4秒很容易解释为你的代码连续两次阻止相同的数字是错误的。每次输入changeBallColor时,都会创建一个新的previousint,其中nil为默认值。

这导致循环根本不被执行,因为nil永远不会等于任何arc4random_uniform(4)返回。

解决方案

previousint的定义移出您的类,使其在changeBallColor的连续调用中保持其值:

class ABC {
    var previousint: UInt32?

    func changeBallColor() {
        var randint = arc4random_uniform(4)
        while previousint == randint {
            print("loop")
            randint = arc4random_uniform(4)
        }
        previousint = randint

        if previousint == 0 {
            imageBall.image = UIImage(named: "circle_g.png")
        } else if previousint == 1 {
            imageBall.image = UIImage(named: "circle_b.png")
        } else if previousint == 2 {
            imageBall.image = UIImage(named: "circle_r.png")
        } else if previousint == 3 {
            imageBall.image = UIImage(named: "circle_y.png")
        }  
    }
}