Предотвращение задержек срабатывания NSTimer в фоновом приложении - PullRequest
0 голосов
/ 24 мая 2018

Я работаю над приложением macOS (назовем его «приложением отображения»), которое отображает часы и другие данные, которые управляются другим приложением («управляющим приложением») на той же машине через соединение TCP,Я заметил, что, когда приложение дисплея некоторое время не используется (> 60 секунд), а затем планирует NSTimer (с интервалом 0,2 секунды), требуется очень много времени, прежде чем таймер сработает дляв первый раз (в диапазоне 6-10 секунд, иногда дольше.) Это происходит в основном, когда приложение дисплея не находится на переднем крае (потому что это приложение управления.) Как только таймер сработал в первый раз, он работает как положено (снекоторые небольшие, ожидаемые задержки в таймере) на некоторое время.

Но когда таймер работает в течение длительного времени (более 5 минут), существуют похожие экстремальные задержки между срабатыванием (также 6-10 секунд).) Похоже, что ручное планирование таймера с помощью

[[NSRunLoop mainRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];

немного откладывает проблему (при использовании [NSTimer scheduledTimer...] эта проблема появляется раньше, чем при ручном добавлении ее в цикл запуска.)

Этовызывает много проблем, потому что часы не обновляются в течение этого времени.

Я предполагаю, что это происходит потому, что macOS считает приложение отображения "неактивным" или "неактивным" в некотором роде.

Есть ли способ предотвратить, контролировать или обойти это поведение?

1 Ответ

0 голосов
/ 25 мая 2018

Это App Nap .Приложение отображения может делать следующее, чтобы не дремать:

id activity = [[NSProcessInfo processInfo] beginActivityWithOptions:NSActivityUserInitiatedAllowingIdleSystemSleep reason:@"whatever"];

Когда оно может снова разрешить дремать, вы должны сделать:

[[NSProcessInfo processInfo] endActivity:activity];
...