2012-01-17 2 views
1

У меня есть метод, выполняющий функциюSelector на себя каждые 0,01 секунды, чтобы постоянно обновлять изображение.Как остановить UIView от прерывания performSelector

-(void)setNeeds 

[mag setNeedsDisplay]; 
[vc setNeedsDisplay]; 
[na setNeedsDisplay]; 
[wave setNeedsDisplay]; 
[mon setNeedsDisplay]; 

[self performSelector:@selector(setNeeds) 
      withObject:NULL 
      afterDelay:.01]; 

Это обновление прекрасно, когда есть нормальное взаимодействие с пользователем. Однако, когда пользователь перемещает значения в UIViewPicker, все обновления приостанавливаются до тех пор, пока взаимодействие не прекратится. То же самое происходит с объектом NSTimer, установленным на повторение.

Я надеюсь на более последовательный метод выполнения непрерывного действия, но решение этой проблемы также будет грандиозной.

ответ

0

Это довольно распространенный вопрос, так как NSTimer, созданный с помощью scheduledTimerWith..., может приостановиться во время взаимодействия с пользователем. Here is a similar question. Методы performSelector:..afterDelay:.. используют внутри себя, как вы могли себе представить, NSTimer. В основном, когда вы используете scheduledTimerWith... или performSelector:..afterDelay:.., ваш таймер запланирован в цикле запуска для NSDefaultRunLoopMode, который может приостанавливаться, пока пользователь взаимодействует с приложением. Решение состоит в том, чтобы запланировать таймер в цикле выполнения самостоятельно для CommonModes так:

timer = [NSTimer timerWithTimeInterval:0.01 target:self selector:@selector(setNeeds) userInfo:nil repeats:YES]; 
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 

Если вы против управления собственной NSTimer для этой функции, то вы можете использовать функцию performSelector:withObject:afterDelay:inModes:. Последним аргументом является массив режимов цикла запуска, в который вы можете положить NSRunLoopCommonModes.

0

Маркировка всего, что нужно отображать каждые 1/100-й секунды, не даст вам частоты кадров 100 кадров в секунду, маркировка чего-либо, поскольку отображение потребностей дает возможность просмотра только следующего прохода через главный прогон.

если рисунок занимает 1/10 секунды, то вы получите 10fps ...

плюс такой подход требует setNeeds называть, и если этот цикл вызов каким-то образом прервала она никогда не будет возобновлено, вам должен использовать вызов NSTimer + scheduleTimer ..., чтобы сделать повторяющийся таймер.

Смежные вопросы