2016-01-10 6 views
1

У меня есть функция, называемая changeBallColor(), которая вызывается каждый раз, когда NSTimer I создавал огни (который установлен на 2-секундные интервалы). Цель состоит в том, чтобы изменить цвет мяча каждые 2 секунды на случайный цвет, не повторяя два цвета подряд. За исключением того, что цвет меняется почти мгновенно, а иногда и занимает 4 секунды. Когда это занимает больше времени, я заметил в отладчике xcode, что использование ЦП на 99% мгновенно до изменения цвета. Делает ли arc4random_uniform() какое-то время или что-то (в тех случаях, когда используется цикл while)? Если да, то как я могу оптимизировать этот код, чтобы он работал безупречно? Извините, я новичок, когда дело доходит до Свифта.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

О, дух ...' previousint' получает redeclared каждый раз, когда запускается NSTimer, это вверх. Переместил его до вершины моего класса ViewController, и теперь он работает безупречно. Спасибо и извините за то, что тратили свое время с такой глупой проблемой. – modernwar24

ответ

2

У меня нет никакого объяснения шипа процессора, но 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") 
     } 
    } 
} 
Смежные вопросы