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