经过数天的复杂操作后,我对按预定时间间隔更新的更新流程有信心地说出以下内容:
- 系统调用
requestedUpdateDidBegin()
。- 在这里,您可以确定您的数据是否更改。如果没有更改,您的应用程序无需做任何事情。如果您的数据已更改,则需要调用以下方法之一:
- 如果需要重置所有数据,请使用
reloadTimelineForComplication
。 - 如果只需要将新项添加到并发症时间线的末尾,请使用
extendTimelineForComplication
。
- 如果需要重置所有数据,请使用
- 注意:如果你的复杂性时间预算超支了,系统实际上可能会调用
requestedUpdateBudgetExhausted()
而不是requestedUpdateDidBegin()
。这就是这个问题的原因。
- 在这里,您可以确定您的数据是否更改。如果没有更改,您的应用程序无需做任何事情。如果您的数据已更改,则需要调用以下方法之一:
- 如果您调用了
reloadTimelineForComplication
,系统将调用getCurrentTimelineEntryForComplication
(连同获取数组的未来和过去变体,具体取决于您的时空旅行设置) - 这是推测,因为我还没有测试过,但我认为如果您调用了
extendTimelineForComplication
,那么仅会调用getTimelineEntriesForComplication(... afterDate date: NSDate ...)
。 - 然后,系统将调用
getNextRequestedUpdateDateWithHandler
,以便您指定多长时间才需要新的更新。
苹果的文档非常清楚,您不应过于频繁地要求更新,或在并发症代码中进行太多处理,否则您的时间预算将耗尽,并且并发症将停止更新。那么,我的问题是:您何时何地进行更新?
为了背景,我的情况是一个URL,返回数据每小时更改最多两次。
最明显的放置URL获取代码的位置是func requestedUpdateDidBegin()
。获取数据,存储它,如果没有更改,则只需返回。如果有更改,则扩展或重新加载时间线。
然而,URL抓取可能会很昂贵。替代方案:
- 将代码放在手机应用程序中,并使用
WCSession
发送,但如果用户关闭该应用程序,则更新将不再发生。 - 使用推送更新,但这不是Web应用程序,因此我无法从其中发送它们。
- 显然,当用户与手表应用程序交互时,我将更新所有数据,但这意味着仅在用户使用应用程序时才会更新数据,这就否定了需要使用复杂功能的原因。
还有其他地方吗?我能否在手表应用程序中拥有一个周期性函数,而不是作为复杂功能的一部分?哪里是为复杂功能更新获取数据的正确位置?
requestedUpdateDidBegin()
可能不会计入您的时间预算。显然,重新加载和扩展的调用都会计入预算。因此,在缺乏其他信息的情况下,我倾向于在requestedUpdateDidBegin()
中执行操作,但我仍在寻找实际答案,而不是我的猜测... - El Tea