2016-10-17 5 views
0

У меня проблема в iOS. Зеленый ViewController должен включить через несколько секунд на красный и у меня есть этот код:usleep не работает в iOS

override func viewDidLoad() { 
    super.viewDidLoad() 
    let ZeitZahl = arc4random_uniform(1499) + 6000 
    usleep(ZeitZahl) 
    update() 
} 

и

func update(){ 
    self.view.backgroundColor = UIColor(red: 1, green: 0, blue: 0, alpha: 1.0) 
} 

поворота к себе красный прекрасно работает! Но это не задерживает, оно повернулось прямо к красному! Я пробовал его с usleep(5000) вместо usleep(ZeitZahl), но он не сделал паузу. Пожалуйста, что я делаю неправильно?

+3

Никогда не называйте 'usleep'. Никогда. Я имею в виду, никогда. Не помню ли я сказать «никогда»? – matt

+0

Да, у вас есть @matt – Blub

ответ

0

Вы называете это хорошо! Но 5000, пройденный к лету, составляет 5000 микросекунд. Это всего лишь 0,005 секунды. Таким образом, вы 1) не спите достаточно долго, и 2) он блокирует основной поток, поэтому вы не увидите обновление интерфейса до тех пор, пока оно не закончится в любом случае. Таким образом, вы никогда не увидите первоначальное значение.

Вызов спящего не справится с этим. Он заблокирует основной поток, поэтому вы никогда не добьетесь того, чего хотите.

+0

Чувак, он просто спросил, как его использовать. Не нужно ниспровергать и быть противным. Мой ответ говорит, что это не самая умная вещь, но он правильно выполняет вызов. –

+0

Да, вы его исправили. Не беспокойся. – matt

+0

Ваш второй абзац вводит в заблуждение. Использование любой формы «сна» ошибочно и не может использоваться для того, чтобы делать то, что хочет OP. И хороший ответ объяснил бы, почему 'usleep' нельзя использовать и предлагать решения для достижения желаемого результата. – rmaddy

2

То, что вы делаете, бесполезно (и не так). Изменения в интерфейсе: заказал в вашем коде, но не произошел, пока не закончится текущая «транзакция», то есть когда ваш код закончен. Таким образом, независимо от того, как долго вы будете ждать, вы не увидите изменения, пока ваш код не закончится. Например:

usleep(bigNumber) 
    self.view.backgroundColor = .red 
    usleep(bigNumber) 
    self.view.backgroundColor = .green 

Независимо от того, насколько большой bigNumber, вы не никогда видят красный цвет.

Однако, вы не должны использовать usleep. Вы блокируете основной поток. Это замораживает интерфейс, и процесс Watchdog убьет ваше приложение мертвым в качестве наказания.

+0

Что я могу сделать, чтобы использовать его правильно? – Blub

+0

я нашел личный способ 'вар GrünZuRot?: Таймер' 'Dann переопределение FUNC viewDidLoad() { super.viewDidLoad() пусть ZeitZahl = arc4random_uniform (1499) + 6000 self.GrünZuRot = Timer.scheduledTimer (TimeInterval: TimeInterval (ZeitZahl/1000), target: self, selector: #selector (update), userInfo: nil, repeat: true) } 'und dann' func update() { self.GrünZuRot = nil self.view.backgroundColor = UIColor (красный: 1, зеленый: 0, синий: 0, alpha: 1.0)} – Blub

+0

Точно верно. Понимаете, почему?Наш код заканчивается, а затем таймер вызывает нас позже. Мы не блокируем. – matt