在处理了几天的并发症后,我有信心对按规定时间间隔发生的更新的更新过程说以下内容:
- 系统调用
requestedUpdateDidBegin()
- 您可以在此处确定您的数据是否已更改。如果没有,您的应用程序无需执行任何操作。如果您的数据已更改,您需要致电:
reloadTimelineForComplication
如果您的所有数据都需要重置。extendTimelineForComplication
如果您只需要在并发症时间线的末尾添加新项目。
- 注意:系统实际上可能会调用
requestedUpdateBudgetExhausted()
,而不是requestedUpdateDidBegin()
如果您在当天花费了过多的并发症时间预算。这就是这个问题的原因。
- 您可以在此处确定您的数据是否已更改。如果没有,您的应用程序无需执行任何操作。如果您的数据已更改,您需要致电:
- 如果您调用
reloadTimelineForComplication
,系统将调用getCurrentTimelineEntryForComplication
(以及获取数组的未来和过去变体,具体取决于您的时间旅行设置) - 这是猜想,因为我还没有测试它,但我相信如果你调用
extendTimelineForComplication
它,只会getTimelineEntriesForComplication(... afterDate date: NSDate ...)
调用它。 - 然后系统将调用
getNextRequestedUpdateDateWithHandler
,以便您可以指定您的并发症需要多长时间才能进行新的更新。
Apple 的文档非常清楚,您不应该过于频繁地要求更新,或者在并发症代码中进行过多的处理,否则您将耗尽您的时间预算,您的并发症将停止更新。所以,我的问题是:您在何时何地进行更新?
对于上下文,我的场景是一个 URL,其返回数据每小时最多更改两次。
放置 URL 获取代码最明显的地方是func requestedUpdateDidBegin()
获取数据,存储它,如果没有变化,就返回。如果有更改,则延长或重新加载时间线。
但是,获取 URL 的成本可能很高。备择方案:
- 将代码放在手机应用程序上并使用 发送
WCSession
,但如果用户关闭该应用程序,则更新将不再发生。 - 使用推送更新,但这不是网络应用程序,所以我没有地方可以发送它们。
- 显然,当用户与手表应用程序交互时,我会更新所有数据,但这意味着它仅在用户使用应用程序时才会更新,这消除了对复杂性的需求。
还有其他地方吗?我可以在手表应用程序中设置不属于复杂功能的周期性功能吗?获取复杂功能更新数据的正确位置在哪里?