2016-01-10 53 views
1

我有一個叫做changeBallColor()的函數,每調用一次NSTimer就會調用它(它被設置爲2秒間隔)。目標是每2秒將球的顏色更改爲隨機顏色,而不必連續重複兩種顏色。除了顏色變化幾乎立即有時和其他時間需要4秒改變。當更改時間更長時,我注意到在xcode調試器中,CPU使用率在顏色變化之前瞬間達到99%。 arc4random_uniform()需要一段時間才能完成或使用while循環(在使用while循環的情況下)?如果是這樣,我該如何優化這段代碼才能完美運行?對於Swift,我很抱歉,我是一個noob。Swift爲什麼我的NSTimer不能均勻地射擊?

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

你不打兩次相同顏色的邏輯是錯誤的,因爲'previousint'是一個局部變量。考慮添加'print'語句,告訴你在循環中哪些隨機數被擊中以及循環被執行的頻率(總是0次)等等。 – luk2302

+0

噢,呃......每當NSTimer開火時都會重新聲明'previousint'它起來。將它移到我的ViewController類的頂部,它現在完美運行。謝謝你,併爲這樣一個愚蠢的問題浪費你的時間感到抱歉。 – modernwar24

回答

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") 
     } 
    } 
} 
相關問題