3

从下面的数据来看,ClockKit 生成了CLKComplicationTimelineEntry一次未来的项目,但是对于过去的时间点,进行了 24 次调用!为什么是这样?

更多细节:

我注意到我的 Apple Watch 并发症中有一种奇怪的行为。

它支持时间旅行——我提供过去 1 天、未来 4 天的数据。我目前正努力成为一个好公民,减少重新生成并发症数据的调用。

为了了解某些调用的频率,我print在两者中都放了一个简单的getTimelineEntries(for:before:limit:withHandler:)getTimelineEntries(for:after:limit:withHandler:)输出before/after参数。

当我在模拟器中启动 App/Complication 时,我得到以下输出:

generate future timeline entries (after date:2016-07-23 10:33:31 +0000)
generate past timeline entries (before date:2016-07-23 10:33:31 +0000)
generate past timeline entries (before date:2016-07-23 09:33:31 +0000)
generate past timeline entries (before date:2016-07-23 08:33:31 +0000)
generate past timeline entries (before date:2016-07-23 07:33:31 +0000)
generate past timeline entries (before date:2016-07-23 06:33:31 +0000)
generate past timeline entries (before date:2016-07-23 05:33:31 +0000)
generate past timeline entries (before date:2016-07-23 04:33:31 +0000)
generate past timeline entries (before date:2016-07-23 03:33:31 +0000)
generate past timeline entries (before date:2016-07-23 02:33:31 +0000)
generate past timeline entries (before date:2016-07-23 01:33:31 +0000)
generate past timeline entries (before date:2016-07-23 00:33:31 +0000)
generate past timeline entries (before date:2016-07-22 23:33:31 +0000)
generate past timeline entries (before date:2016-07-22 22:33:31 +0000)
generate past timeline entries (before date:2016-07-22 21:33:31 +0000)
generate past timeline entries (before date:2016-07-22 20:33:31 +0000)
generate past timeline entries (before date:2016-07-22 19:33:31 +0000)
generate past timeline entries (before date:2016-07-22 18:33:31 +0000)
generate past timeline entries (before date:2016-07-22 17:33:31 +0000)
generate past timeline entries (before date:2016-07-22 16:33:31 +0000)
generate past timeline entries (before date:2016-07-22 15:33:31 +0000)
generate past timeline entries (before date:2016-07-22 14:33:31 +0000)
generate past timeline entries (before date:2016-07-22 13:33:31 +0000)
generate past timeline entries (before date:2016-07-22 12:33:31 +0000)
generate past timeline entries (before date:2016-07-22 11:33:31 +0000)
4

2 回答 2

2

没有规定您的数据源方法只会被调用一次。您只需要准备好处理请求。

为什么它处理过去的条目与未来的条目不同?

我相信这是一种优化,旨在优先考虑即将到来的时间线条目(超过最近的过去条目)。

回到 watchOS 2.0.1,复杂功能服务器首先用未来的条目填充时间线,然后继续用过去的条目回填时间线。当然,Apple 可能会选择批量处理过去的条目以优先考虑最近的条目而不是更远的条目,这当然是可以理解的。

虽然从那时起,Apple 确实对其代码进行了调整,但在当前版本的 watchOS 中,同样的关注和细节水平可能会继续适用。

如果我完成一项昂贵的手术怎么办?

如果您要做的不仅仅是简单地使用手头现有的复杂数据,并且您的数据检索与系统发出的特定请求相关联,那么您应该重构该代码以将其移出该方法。

通常,您希望手头已有预取数据,可以直接将其转换为时间线条目。

这在 watchOS 3 中变得更加重要,因为您不仅要更新复杂功能,还要在后台更新应用程序。即使您现在仍然需要支持 watchOS 2,您也应该设计如何获取数据和更新复杂性,以了解 watchOS 3 如何完成更新您的整个应用程序。

为什么它不止一次调用我的数据源方法?

Apple 使用多种技术来优化复杂功能服务器(或操作系统的其他部分)的工作方式。您所能做的就是相信系统经过调整以减少其内存和能源使用,并且它做它做的事情是有充分理由的。

这实际上是多年来的标准做法,并且在 中很常见UITableViewDataSource,其中类似的方法numberOfSectionsInTableView 可能会被多次调用

正如另一位海报所写,调用方法的次数可能会在不同版本的操作系统之间发生变化

如果它是一个错误怎么办?

它可能按预期工作,但如果您认为这是一个错误,您可以创建一个最小的示例项目并将其与错误报告一起提交给 Apple

关于时间旅行的无关注释

我注意到您想提供 4 天的未来时间旅行条目。这将超过时间旅行滑动窗口。

为了效率起见,您可能需要考虑latestTimeTravelDate

构建时间线时,请勿在此日期之后创建任何条目。这样做是浪费时间,因为这些条目不会立即显示。

于 2016-07-23T16:46:35.277 回答
0

我几乎可以肯定这实际上与我在 watchOS 应用程序中遇到的问题相同;当复杂服务器希望条目按从最近到最近的顺序时,我的代码正在生成从最近到最近的时间线条目数组。

因此,并发症服务器使除我生成的第一个条目之外的所有条目都无效,并在该条目之前立即请求更多更新。

我的解决方法是将我的getTimelineEntries(for:after:limit:withHandler:)函数从appending 条目更改insert为索引 0 处的 ing。

于 2018-11-03T19:27:21.850 回答