Таймер перестал работать после обновления до Xcode 7.3/Swift 2.2

После обновления до Swift 2.2 и Xcode 7.3 мой повторяющийся NSTimer перестал повторяться.

let timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: #selector(rotate), userInfo: nil, repeats: true)
timer.fire()

Селектор срабатывает один раз, затем не срабатывает снова, пока окно не закроется или не будет свернуто.

Кто-то еще? Какие-либо предложения?


person Erik Bean    schedule 01.04.2016    source источник
comment
Он срабатывает один раз, но больше никогда. Извините, я думал, что сказал это.   -  person Erik Bean    schedule 01.04.2016
comment
Все равно не повторится. :(   -  person Erik Bean    schedule 01.04.2016


Ответы (3)


Таймеры должны всегда планироваться или аннулироваться в одном и том же потоке, может быть, вы вызываете его внутри асинхронного блока? Попробуйте запланировать его в основной очереди:

dispatch_async(dispatch_get_main_queue(), { () -> Void in
    let timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: #selector(rotate), userInfo: nil, repeats: true)
    timer.fire()
    })
person Marco M    schedule 01.04.2016
comment
Вызов его в моем представленииDidLoad(). Что странно, это работало до того, как я обновился до 7.3, и мой таймер сработает ТОЛЬКО после закрытия окна. - person Erik Bean; 01.04.2016
comment
Я знаю, у меня была такая же проблема с одним таймером внутри проекта, над которым я работаю... dispatch_async помог мне... - person Marco M; 01.04.2016
comment
Все равно не повторится. Спасибо за ответ. - person Erik Bean; 01.04.2016
comment
Я исправил, ты был рядом! Это проблема не только потока, но и NSRunLoop. - person Erik Bean; 01.04.2016
comment
Рад, что немного помог, на самом деле проблема с потоком связана с потоком цикла выполнения, но не могли бы вы сообщить нам, как именно вы решили эту проблему? Спасибо - person Marco M; 01.04.2016

func startTimer() {
    let timer = NSTimer(timeInterval: 1, target: self, selector: #selector(MainViewController.updateLabel), userInfo: nil, repeats: true)
    NSRunLoop.currentRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes)
}

Это работает для меня в документации Apple Swift 2.2 ничего не говорится о dispatch_async. Есть ли причина использовать его... просто любопытно... все еще учусь

Используйте метод класса timerWithTimeInterval:invocation:repeats: или timerWithTimeInterval:target:selector:userInfo:repeats: для создания объекта таймера без планирования его в цикле выполнения. (После его создания вы должны добавить таймер в цикл выполнения вручную, вызвав метод addTimer:forMode: соответствующего объекта NSRunLoop.)

person Sonny    schedule 01.04.2016

    dispatch_async(dispatch_get_main_queue()) {
        self.timer = NSTimer(timeInterval:1.0, target:self, selector: #selector(self.rotate), userInfo:nil, repeats:true)
        NSRunLoop.currentRunLoop().addTimer(self.timer!, forMode: NSRunLoopCommonModes)
    }

Это проблема с потоками, а также неправильное добавление или автоматическая обработка в NSRunLoop. Выполнение этого вручную в том же потоке исправило это.

Спасибо всем за помощь и рекомендации.

person Erik Bean    schedule 01.04.2016