Обновление сложности с помощью 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:)
запланировать (или начальную, или) будущую задачу до ее завершения.
Хотя в их примере используется кнопка обновления для планирования следующего фонового обновления, концепция остается той же, будь то действие пользователя или фоновая задача, которая планирует следующий запрос).