После работы с осложнениями в течение нескольких дней я уверенно говорю следующее о процессе обновления обновлений, которые происходят в заданный интервал:
- Системные вызовы
requestedUpdateDidBegin()- Здесь вы можете определить, изменились ли ваши данные. Если этого не произошло, вашему приложению ничего не нужно делать. Если ваши данные были изменены, вам необходимо позвонить либо:
-
reloadTimelineForComplication, если все ваши данные должны быть reset. -
extendTimelineForComplication, если вам нужно только добавить новые элементы в конец временной шкалы осложнений.
-
- Примечание: система может фактически называть
requestedUpdateBudgetExhausted()вместоrequestedUpdateDidBegin(), если вы потратили слишком много вашего бюджета времени на сложность на день. Это и есть причина этого вопроса.
- Здесь вы можете определить, изменились ли ваши данные. Если этого не произошло, вашему приложению ничего не нужно делать. Если ваши данные были изменены, вам необходимо позвонить либо:
- Если вы вызвали
reloadTimelineForComplication, система будет вызыватьgetCurrentTimelineEntryForComplication(вместе с будущими и прошлыми вариантами, которые получают массивы, в зависимости от ваших настроек времени поездки) - Это гипотеза, поскольку я еще не тестировал ее, но я верю, что если бы вы назвали
extendTimelineForComplication, что будет вызван толькоgetTimelineEntriesForComplication(... afterDate date: NSDate ...). - Затем система вызовет
getNextRequestedUpdateDateWithHandler, чтобы вы могли указать, сколько времени потребуется вашему усложнению для нового обновления.
В документации Apple достаточно ясно, что вы не должны часто запрашивать обновления или слишком много обрабатывать в коде осложнения, или вы исчерпаете свой бюджет времени, и ваше осложнение перестанет обновляться. Итак, мой вопрос: где и когда вы делаете обновление?
В контексте, мой сценарий - это URL с данными возврата, которые изменяются до двух раз в час.
Наиболее очевидным местом для размещения кода выборки URL является func requestedUpdateDidBegin() Получить данные, сохранить их, а если нет изменений, просто верните их. Если произошли изменения, то продлить или перезагрузить временную шкалу.
Однако выборка URL-адресов может быть дорогостоящей. Альтернативы:
- Поместите код в приложение телефона и отправьте его с помощью
WCSession, но если пользователь закрывает это приложение, обновления больше не будут выполняться. - Используйте push-обновления, но это не веб-приложение, поэтому мне некуда отправлять их.
- Очевидно, что я обновлю все данные, когда пользователь взаимодействует с часовым приложением, но теперь это означает, что он обновляется только тогда, когда пользователь использует приложение, что отрицает необходимость усложнения.
Есть ли где-нибудь еще? Могу ли я иметь периодическую функцию в приложении часов, которая не является частью усложнения? Где подходящее место для извлечения данных для обновления осложнений?