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")
}
}
}
我有一个名为 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")
}
}
}