iOS: Использование истории HKObserverQuery обновляет completionHandler

HKObserverQuery имеет следующий метод, который поддерживает обновления получения в фоновом режиме:

- initWithSampleType:predicate:updateHandler:

updateHandler имеет a completionHandler который имеет следующую документацию:

Этот блок передается обработчику обновлений. Необходимо назвать этот блок, как только Вы сделаны, обработав входящие данные. Вызов этого блока говорит HealthKit об успешном получении фоновых данных. Если Вы не называете этот блок, HealthKit продолжает пытаться запустить Ваше приложение с помощью алгоритма задержки. Если Вашему приложению не удается ответить три раза, HealthKit предполагает, что Ваше приложение не может получить данные и прекращает отправлять Вам фоновые обновления.

От рассмотрения других сообщений кажется, что существует много беспорядка, вращающегося вокруг этого обработчика. Ниже некоторые вопросы, которые я имею об этом:

  • Когда обработчик нужно назвать? Если названо слишком поздно, то HK могла бы думать, что приложение никогда не получало обновление запроса, заставляющее Вас поражать фон, обновляют алгоритм задержки с 3 забастовками. Документация указывает, что это нужно назвать после обработки других запросов. В зависимости от того, сколько времени это взяло бы для выполнения тех запросов, это кажется, что Вы могли добраться опасно близко к удару фоновых забастовок обновления.
  • Почему это необходимо? Разве система не должна знать, что приложение было запущено и получило фоновое обновление? При использовании CoreBluetooth в фоновом режиме это просто будит Ваше приложение в фоновом режиме в течение 10 секунд. Никакая потребность назвать любой обработчик или соглашение с фоном не обновляет 3 забастовки.
  • Если Вы поражаете фоновые 3 забастовки обновления, и HK прекращает отправлять, обновления является настолько постоянным? HK когда-либо начинает отправлять фоновые обновления снова? Что, если существует ошибка, которая предотвратила обработчик, который назовут и теперь Вы зафиксировали его. Приложение, никогда не застревает не получая обновления? Или это сбросит, когда приложение будет повторно запущено или обновлено?
  • HK поддерживает Ваше приложение в рабочем состоянии в фоновом режиме, пока обработчик не называют? Та часть его цели или просто побочный эффект? Если это - часть своей цели, сколько времени мы можем работать прежде, чем должными быть остановить (и поразить первую фоновую забастовку обновления)?

60
задан 11 October 2019 в 15:36

1 ответ

, Когда обработчик нужно назвать?

Вызов это после того, как Вы сделаны Ваше задание. Ваш код не должен делать сложных операций. Приложение в фоновом режиме, и пользователь не видит то, что изменяется. Можно просто установить "флаг", что данные обновляются, и сделайте сложные операции после того, как пользователь запустил приложение. Если Ваше решение или об уведомляет пользователя или о не на основе сложных операций, то попытайтесь осуществить рефакторинг код так, чтобы все необходимые данные были предварительно вычислены (например, в UserDefaults), и дополнительные данные просто выбираются с теми данными. Так, 1-2 секунды достаточно для Вашего вычисления.

, Почему это необходимо?

Все такие обработчики имеют закрытия завершения. Они необходимы, чтобы iOS знала, хорошо работает ли Ваше приложение. Если Ваше приложение съест слишком много процессорного времени, то iOS могла стать медленной. Следовательно, Apple хочет быть уверенной, что iOS хорошо работает несмотря на неработающие приложения.

, Если Вы поражаете фоновые 3 забастовки обновления и HK, прекращает отправлять, обновления является настолько постоянным?

HK когда-либо начинает отправлять фоновые обновления снова?

Да. Но это зависит от многих факторов. Это может попытаться назвать Ваше приложение снова через 1-2 дня. Если ничто не изменится, то это будет редко называть его.

HK поддерживает Ваше приложение в рабочем состоянии в фоновом режиме, пока обработчик не называют?

Это неизвестно. Это зависит от многих факторов. Вероятно, если iPhone будет заряжаться, то он позволит запускать Ваше приложение дольше только, чтобы оценить, называют ли дескриптор завершения или нет. Если Ваш iPhone не будет заряжаться и закрытый для 0%-й батареи, то более вероятная iOS уничтожит Ваше приложение. Так, Вы не должны делать никакого задания после вызова обработчика завершений. И попытайтесь сохранить это простым.

Рекомендации

необходимо обработать новые данные как можно быстрее. Если необходимо выбрать много данных, то попытайтесь оптимизировать это и предварительно вычислить его, когда приложение находится на переднем плане, то сохраните где-нибудь (UserDefault) и используйте новые данные с кэшированными данными для принятия решения (например, уведомлять пользователя о чем-то; я полагаю, что Вам нужны фоновые обновления точно для этого).

1-2 секунды или меньше являются хорошим временем для фоновых обновлений.

0
ответ дан 1 November 2019 в 10:59

Другие вопросы по тегам:

Похожие вопросы: