NSTimer замораживает приложение до тех пор, пока оно снова не будет запущено?

У меня есть простое приложение с кнопкой, UIImageView и NSTimer. Таймер запускается каждые 5 секунд повторно, чтобы обновить ImageView новым изображением, в то время как кнопка просто останавливает таймер и переключается на другое представление.

Проблема в том, что когда я нажимаю кнопку, ничего не происходит в течение нескольких секунд (пока снова не сработает таймер).

Есть ли способ заставить кнопку останавливать таймер и выполнять свою работу в любой момент времени, а не между интервалами таймера?

Кнопка определена в InterfaceBuilder и связана с функцией в коде.

Код NSTimer: (я пробовал с и без добавления его в RunLoop).

updateTimer = [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(updateImageViews) userInfo:nil repeats:YES];

NSRunLoop* runLoop = [NSRunLoop currentRunLoop];
[[NSRunLoop currentRunLoop] addTimer:updateTimer forMode:NSDefaultRunLoopMode];
[runLoop run];

Спасибо!


person itai alter    schedule 13.04.2010    source источник
comment
вы используете недействительную остановку таймера...? можешь поставить код...?   -  person Mihir Mehta    schedule 13.04.2010
comment
Я добавил код таймера. И да, я использую недействительность, чтобы остановить таймер в функции, которая вызывается при нажатии кнопки. Благодарность   -  person itai alter    schedule 13.04.2010
comment
Когда вы говорите, что ничего не происходит, вы имеете в виду, что следующее представление не появляется? Появляется ли представление, когда срабатывает таймер? Не совсем понятно в чем проблема. Что хотеть увидеть и что вы на самом деле видите?   -  person TechZen    schedule 13.04.2010
comment
Я имею в виду, что кнопка (и все основное представление) неактивны (заморожены), когда работает NSTimer, и все размораживается, когда NSTimer достигает своего временного интервала. Например: NSTimer запускается впервые --> Приложение зависло --> 1... 2... 3... 4... 5... --> Приложение размораживается, кнопка работает. если я позволю NSTimer выполнить еще один запуск, он снова остановит приложение на 5 секунд. Спасибо за помощь.   -  person itai alter    schedule 14.04.2010


Ответы (1)


«Обратите внимание, что с точки зрения NSRunloop объекты NSTimer не являются «входными» — они относятся к особому типу, и одна из вещей, которые это означает, заключается в том, что они не вызывают возврата цикла выполнения при их срабатывании». (из справочника по классам NSRunLoop) - так что я думаю, вы блокируете продолжение цикла выполнения? Возможно, в качестве решения поставьте таймер на другой поток? У меня тоже с этим проблемы :(

person cheese    schedule 18.04.2010