Обычно я освещал это в другом ответе, но я отвечу на ваш конкретный вопрос здесь.
Вы правы в том, что вам не следует взламывать контроллер усложнения для выполнения какой-либо (асинхронной) выборки. Источник данных должен только отвечать за возврат существующих данных в соответствии с запросом сервера усложнения. Это было верно для watchOS 2 и по-прежнему верно для watchOS 3.
Для watchOS 3 каждое фоновое обновление может планировать следующее.
Обзор процесса:
В вашем конкретном случае вы можете подождать, пока ваша задача WKURLSessionRefreshBackgroundTask
завершит загрузку. В этот момент запланируйте следующее фоновое обновление перед завершением существующей фоновой задачи.
В это время ваше расширение снова будет разбужено, чтобы снова запустить весь фоновый процесс, чтобы:
- Запросить новые данные из вашего веб-сервиса
- Обработайте ответ и обновите хранилище данных
- Скажите усложнению, чтобы оно само обновилось (что будет использовать новые имеющиеся данные).
- Обновите снимок дока
- Запланировать предстоящую задачу фонового обновления
- Отметьте текущую задачу как выполненную.
Вы даже можете связать ряд различных фоновых подзадач, где каждая подзадача обрабатывает отдельный аспект цикла обновления и отвечает за планирование следующей подзадачи.
Образец кода:
Если вы еще не видели его, Apple предоставляет его WatchBackgroundRefresh пример кода, чтобы продемонстрировать часть этого. Ты можешь использовать
WKExtension.shared().scheduleBackgroundRefresh(withPreferredDate:userInfo:)
запланировать (начальную или) будущую задачу до завершения текущей задачи.
Хотя в их примере используется кнопка обновления для планирования следующего фонового обновления, концепция одинакова, независимо от того, является ли это действием пользователя или фоновой задачей, которая планирует следующий запрос).
person
Community
schedule
22.06.2016