Обновление сложности с помощью Swift 3 и фоновой задачи

Для watchOS 3 Apple предлагает обновить услугу с WKRefreshBackgroundTask Вместо того, чтобы использовать getNextRequestedUpdateDate,

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

Я только взломал бы мои данные, запрашивающие (от URL) в getCurrentTimelineEntry и обновил бы усложнение, но я думаю, что это не совсем то, что Apple порекомендует.

Пример короткого кода был бы большой помощью.

1 ответ

Решение

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

Вы правы в том, что вам не следует взламывать контроллер сложности, чтобы выполнять какую-либо (асинхронную) выборку. Источник данных должен нести ответственность только за возврат существующих данных под рукой в соответствии с запросом сервера усложнения. Это было верно для watchOS 2, и все еще верно в watchOS 3.

Для watchOS 3 каждое фоновое обновление может запланировать следующее.

Обзор процесса:

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

В это время ваше расширение снова проснется, чтобы снова запустить весь фоновый процесс:

  • Запрос новых данных с вашего веб-сервиса
  • Обработайте ответ и обновите ваше хранилище данных
  • Скажите усложнение, чтобы обновить себя (который будет использовать новые данные под рукой).
  • Обновить снимок дока
  • Запланируйте предстоящее задание фонового обновления
  • Отметьте текущее задание как выполненное.

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

Образец кода:

Если вы еще этого не видели, Apple предоставляет пример кода WatchBackgroundRefresh, чтобы продемонстрировать часть этого. Ты можешь использовать

WKExtension.shared().scheduleBackgroundRefresh(withPreferredDate:userInfo:)

запланировать (или начальную, или) будущую задачу до ее завершения.

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

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