Как остановить прерывание UIView от executeSelector - PullRequest
1 голос
/ 17 января 2012

У меня есть метод, который выполняет executeSelector сам по себе каждые 0,01 секунды, чтобы постоянно обновлять изображение.

-(void)setNeeds

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 17 января 2012

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

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

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

0 голосов
/ 17 января 2012

Это довольно распространенный вопрос, так как NSTimer, созданный с помощью scheduledTimerWith..., может приостановиться во время взаимодействия с пользователем. Вот похожий вопрос .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.

...