Performance 更新复杂度会逐渐降低watchOS3中Apple Watch应用程序的性能
我已经为这个问题强调了大约一周了,试图找出苹果手表应用程序性能缓慢但稳定下降的根源。在大约两天的时间里,我的应用程序的UI将变得越来越缓慢。我已经把它缩小到一个复杂的更新代码。即使我将复杂度更新减少到绝对最小,这个问题仍然会发生,尽管比使用一些实际数据更新复杂度要慢。我每10分钟更新一次并发症。一旦有了新数据,我只需执行Performance 更新复杂度会逐渐降低watchOS3中Apple Watch应用程序的性能,performance,watchkit,apple-watch-complication,watchos-3,Performance,Watchkit,Apple Watch Complication,Watchos 3,我已经为这个问题强调了大约一周了,试图找出苹果手表应用程序性能缓慢但稳定下降的根源。在大约两天的时间里,我的应用程序的UI将变得越来越缓慢。我已经把它缩小到一个复杂的更新代码。即使我将复杂度更新减少到绝对最小,这个问题仍然会发生,尽管比使用一些实际数据更新复杂度要慢。我每10分钟更新一次并发症。一旦有了新数据,我只需执行 for (CLKComplication *comp in [CLKComplicationServer sharedInstance].activeComplications
for (CLKComplication *comp in [CLKComplicationServer sharedInstance].activeComplications) {
[[CLKComplicationServer sharedInstance] reloadTimelineForComplication:comp];
}
这反过来又要求:
- (void)getCurrentTimelineEntryForComplication:(CLKComplication *)complication withHandler:(void(^)(CLKComplicationTimelineEntry * __nullable))handler {
...
}
这很好,新的数据显示出来,但当重复几十次时,主应用程序的UI响应能力开始显著降低,当重复大约一百次时(不到一天的时间,10分钟的更新),UI的速度确实显著降低
我对复杂的结构没有任何幻想——没有时间旅行,只显示当前数据,一切都是为此而设置的。为了确保我没有看错地方,我做了一个每秒重新加载时间线的测试,在这个测试中,我的GetCurrentTimeLineEntryForComplexing如下所示:
- (void)getCurrentTimelineEntryForComplication:(CLKComplication *)complication withHandler:(void(^)(CLKComplicationTimelineEntry * __nullable))handler {
handler(nil);
}
所以这里没有任何东西,只需返回空的处理程序。然而,即使在这种情况下,在大约100个时间线重新加载后,主应用程序的UI速度也明显减慢
还有一些需要注意的事项:
- 如果我不更新复杂度,应用程序的UI性能永远不会下降,无论我打开它多少次,使用它多长时间,或者数据获取代码在后台运行多少次
- 在模拟器中进行测试时,我无法实现性能下降,但我始终可以看到复杂更新会导致较小但稳定的内存泄漏(同样,无论我在GetCurrentTimeLineEntryForConcurrence方法中进行多么简单的更新,都会发生这种情况)
苹果已经修复了watchOS3.2 beta 1中的问题。我已经在模拟器和real watch上进行了测试。一切都很好,不再有内存泄漏或性能下降。最终,在他们决定修复之前,没有解决方法。我注意到,我所做的每件事都使用了本机日历ecomes非常迟钝,所以可能是新watch操作系统中的一个bug。
在使用日历复杂功能几天后,无法使用该手表表面。即使我更改为其他复杂功能并切换回日历复杂功能,也不会“重置”性能。唯一解决的问题是重新启动手表。(或者忘记日历,改为使用其他复杂功能)苹果已经修复了watchOS3.2 beta 1中的问题。我已经在模拟器和真实手表上对其进行了测试。一切都很好,没有内存泄漏或性能下降。最终没有解决办法,直到他们决定修复它。我注意到米老鼠手表表面似乎开始跳帧如果我使用time travel,在该手表表面激活一段时间后。我将尝试禁用日历复杂性,看看是否仍会发生。如果问题与我在应用程序中注意到的是同一件事,那么只需关闭并重新启动日历应用程序就足够了,而不必重新启动整个手表。我找到了一个“解决方案”所以你不必重新启动。我只需访问iPhone上的日历选项,然后将其更改为“自定义”,然后再更改为“镜像”。这似乎可以重置性能,但并不能解决问题。实际上,我真正的解决方案是使用名为EventsWidget的应用程序。它有一个很好且简单的日历复杂功能,运行平稳。