Swift 为什么我的 NSTimer 不能均匀触发?

Swift why does my NSTimer not fire evenly?

我有一个名为 changeBallColor() 的函数,每次我触发 NSTimer(设置为 2 秒间隔)时都会调用该函数。目标是每 2 秒将球颜色更改为随机颜色,而不是连续重复两种颜色。除了有时颜色几乎立即改变而其他时间需要 4 秒才能改变。当更改需要更长的时间时,我在 xcode 调试器中注意到 CPU 使用率在颜色更改之前瞬间飙升至 99%。 arc4random_uniform() 是否需要一段时间才能完成或其他什么(在使用 while 循环的情况下)?如果是这样,我如何优化此代码以使其完美运行?抱歉,我是 Swift 的菜鸟。

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")
    }  
}

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

这导致循环根本不执行,因为 nil 永远不等于任何东西 arc4random_uniform(4) returns.

解决方案

previousint 的定义从方法中移到您的 class 中,使其在 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")
        }  
    }
}