编写预测未来值并显示时间敏感数据的 Apple Watch Complication

Writing an Apple Watch Complication that predicts future values and displays time sensitive data

我正在为 WatchOS 2 编写 Apple Watch Complication。我试图显示的特定数据(通过网络请求)以 3-6 分钟的时间间隔给出。我有一个预测算法可以预测数据值的样子。这给我带来了一个问题。

因为我想显示我的预测算法必须在时间旅行中提供的数据,所以我想使用 getTimelineEntriesForComplication(在特定日期后请求数据的版本)来提供我的算法认为会的未来值忠实于时间表。然而,当时间向前移动(通常如此)并且我们到达这些预测数据点之一被设置为发生的时间时,预测值不再准确。

例如,假设现在是 12:00 下午,我目前有一个(准确的)数据值 A。预测算法可能会预测接下来两个小时的以下数据值:

然而,当12:30 PM真正到来时,实际数据值可能是F。此外,算法将生成一组新的预测,一直到2:30 PM。我知道我可以使用 updateTimelineForComplication 来指示必须重建时间线,但是我使用此方法有两个问题:

  1. 我怕我会很快超过执行时限
  2. updateTimelineForComplication 刷新整个时间线,考虑到所有过去的数据都完全有效,这对我来说似乎很浪费,它只是需要更新的下 4 个左右的值。

有没有更好的方法来处理这个问题?

目前,如果不重新加载整个时间线,就无法更改特定的时间线条目。你可以 submit a feature request to Apple.

总结

总结以下细节,即使您的服务器每 3-6 分钟更新一次预测,复杂服务器也只会以 10 分钟的间隔更新一次,从一小时开始。重新加载时间线是您唯一的选择,因为它将保证 所有 您的预测在 10 分钟内更新并准确。

具体发现

我在过去涉及 extendTimelineForComplication: 使用最小 10 分钟更新间隔的测试中发现,数据源在滑动 window 之前和之后被要求输入 100 个条目,基于当前时间。

滑动window没有以当前时间为中心。对于 watchOS 2.0.1,它似乎偏向于要求更近期的未来条目(未来约 14-27 分钟后)和较短的过去条目(过去约 100 分钟之前)。

重新加载是更新 ~2 小时滑动范围内任何条目的唯一方法 window。

问题

根据我的经验,extendTimelineForComplication 不如重新加载时间线可靠,因为永远不会重新加载的时间线需要修剪以丢弃条目。每小时的条目数越少,这种情况发生的频率就越低,但一旦时间线缓存增长到足够大,SDK 似乎会主动丢弃缓存头部和尾部的条目,即使这些条目落在 72 小时内-旅行window。我见过的最糟糕的情况是只能向前移动 30 个条目,而不是 100 个条目。

提供了这些细节后,我不建议任何人试图利用未来可能改变的任何行为。

每日预算和电池寿命

至于每日预算,它听起来比实际更不祥,但我认为您必须在复杂服务器将您切断之前进行一些密集的计算。即使有十分钟的更新,我也从未超出预算。 真正的问题是电池使用。您会发现频繁更新会在一天结束之前耗尽电池电量。这可能是苹果推荐的最重要原因:

Complications should provide as much data as possible during each update cycle, so specify a date as far into the future as you can manage. Do not ask the system to update your complication within minutes. Provide data to last for many hours or for an entire day.