使用Watch Complication和Time Travel,经常调用getTimelineEntriesForComplication

时间:2016-07-23 10:57:07

标签: watchkit apple-watch watch-os-2 apple-watch-complication clockkit

根据以下数据,ClockKit会生成一次未来CLKComplicationTimelineEntry个项目,但过去的时间点会产生24个来电!这是为什么?

更多详情:

我注意到Apple Watch复杂功能中出现了一种奇怪的行为。

它支持Time Travel - 我提供过去1天,未来4天的数据。我目前正努力成为一名优秀的公民,并减少重新生成复杂数据的电话。

为了了解某些通话的频率,我在printgetTimelineEntries(for:before:limit:withHandler:)内放了一个简单getTimelineEntries(for:after:limit:withHandler:),输出before / after参数。

当我在Simulator中启动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)

2 个答案:

答案 0 :(得分:2)

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

为什么它处理过去的条目与以后的条目不同?

我认为这是一项优化,旨在优先考虑即将到来的时间表条目(最近的条目)。

回到watchOS 2.0.1,并发服务器首先在时间轴上填入未来的条目,然后再继续backfill the timeline with past entries。苹果当然可以选择批量过去的条目来优先考虑更近期的条目而不是更远的条目,这当然是可以理解的。

虽然从那时起苹果公司肯定已经调整了它的代码,但在当前版本的watchOS中,相同程度的关注和细节可能会继续存在。

如果这对我来说是一项昂贵的操作会怎样?

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

一般情况下,您希望手头上有预取数据,可以直接将其转换为时间轴条目。

当您not merely updating a complication时,这在watchOS 3中变得更加重要,同时也会在后台更新您的应用。即使你现在仍然需要支持watchOS 2,你应该设计如何获取数据并更新复杂性,以便了解watchOS 3如何完成更新整个应用程序。

为什么多次调用我的数据源方法?

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

多年来,这实际上是一种标准做法,常见于UITableViewDataSource,其中有numberOfSectionsInTableView might be called several times等方法。

正如另一张海报所写的那样,调用方法的次数为can change between different versions of the OS

如果是个错误怎么办?

它可能按预期工作,但如果您认为这是一个错误,您可以创建一个最小的示例项目并使用bug report to Apple提交。

关于时间旅行的无关说明

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

为了提高效率,您可能需要考虑latestTimeTravelDate

  

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

答案 1 :(得分:0)

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

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

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