Как убедиться, что NSTimer всегда работает в NSView? - PullRequest
1 голос
/ 11 января 2011

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

Это все работает нормально, но, когда вид не в фокусе (то есть щелчок правой кнопкой мыши на панели инструментов для вызова меню), таймер задерживается и не срабатывает в то время, когда вид не в фокусе.

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

Ответы [ 2 ]

4 голосов
/ 11 января 2011

Когда вы выполняете определенные события (например, отображаете контекстное меню), цикл выполнения переходит в режим отслеживания событий. Это означает, что будут обрабатываться только определенные события. Чтобы таймер срабатывал, пока цикл выполнения находится в этом режиме, включите NSEventTrackingRunLoopMode в список режимов для таймера.

NSTimer *timer = [NSTimer timerWithTimeInterval:theInterval target:theTarget selector:theSelector userInfo:theUserInfo repeats:shouldRepeat];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSEventTrackingRunLoopMode];
0 голосов
/ 11 января 2011

одно потенциальное объяснение:

срабатывает таймер, и события вовремя добавляются в очередь. однако большая часть AppKit не является поточно-ориентированной, поэтому ... вы не увидите обновления до следующей итерации цикла выполнения. iow, события заблокированы, потому что все события передаются через главный цикл выполнения / поток.

имеет смысл?

примечание: чтобы сделать проблемы еще более сложными, асинхронное рисование является довольно новым для os x (на уровне NSView), поэтому убедитесь, что вы тестируете все основные версии ОС, которые вы намереваетесь поддерживать. результаты / поведение будут отличаться.

...