2016-10-05 121 views
3

我一直在关注这个问题大约一周,试图指出缓慢而稳定的Apple Watch应用程序性能下降的来源。在大约两天的时间里,我的应用程序界面会变得越来越慢。我已经缩小到一个并发症更新代码。即使我将复杂度更新降低到绝对最小值,这个问题仍然会发生,尽管比用一些实际数据更新并发症要慢。我每10分钟更新一次并发症。一旦新数据到来时,我只需执行更新复杂功能逐渐降低watchOS3中的Apple Watch应用性能

for (CLKComplication *comp in [CLKComplicationServer sharedInstance].activeComplications) { 
    [[CLKComplicationServer sharedInstance] reloadTimelineForComplication:comp]; 
} 

进而调用:

- (void)getCurrentTimelineEntryForComplication:(CLKComplication *)complication withHandler:(void(^)(CLKComplicationTimelineEntry * __nullable))handler { 
... 
} 

这工作得很好,新的数据显示,但是当重复了几十倍,的的UI响应主应用程序开始显着降级,并且当它重复约一百次(发生在10分钟内更新的不到一天)时,UI显着减慢。

我对复杂性结构没什么特别的喜好 - 没有时间旅行,只是显示当前数据,并且所有设置都是为此设置的。为了确保我不是在寻找在错误的地方,我做了一个测试,重新加载时间线每一秒,而在本次测试,我getCurrentTimelineEntryForComplication看起来是这样的:

- (void)getCurrentTimelineEntryForComplication:(CLKComplication *)complication withHandler:(void(^)(CLKComplicationTimelineEntry * __nullable))handler { 
    handler(nil); 
} 

所以有几乎一无所有去那里,只需发回空处理程序。然而,即使在这种情况下,经过一百次左右的时间线重新加载之后,主应用程序的用户界面速度会明显下降。

其他需要注意以下几点:

  • 如果我不更新的复杂性,应用程序的UI表现从来没有下降,不管多少次,我打开它,要不了多久我使用它,或数据获取代码在后台运行多少次。

  • 在模拟器中进行测试时,我无法获得性能下降的情况,但我可以始终如一地看到,复杂性更新中存在小而稳定的内存泄漏(再次发生这种情况,无论如何简单的更新我做getCurrentTimelineEntryForComplication方法内。

有其他人注意到这一点,并没有任何希望来对付它?我做错了什么?就目前我确保只有更新并发症如果数据发生了变化,但这只是推迟了问题,而不是解决问题。10月24日编辑

我已经做了一个真正的手表更仔细的测试,虽然之前由于某种原因,我没有注意到这个在真正的手表相关的内存泄漏,我现在肯定看到了发生。真正的设备完全反映了模拟器上看到的问题,只是使用了不同的初始内存分配量。

同样,我所做的就是在一个常量循环中调用reloadTimelineForComplication,并使用来自缓存数据对象的单行文本更新并发症,否则复杂化控制器会被剥离到最低限度。当复杂功能从手表表面上移除时,内存泄漏可预测地停止。

我的主要项目是用ObjectiveC编写的,但是我用Swift制作的测试项目重复了测试,并没有任何区别。此外,最新的XCode 8.1 GM以及随附的模拟器提供的watchOS 3.1 beta版本,以及在安装了watchOS3.1的真正手表上运行该问题仍然存在。

2017年1月24日编辑

可悲的是,问题watchOS 3.1.3仍然存在,完全不变。与此同时,我已经联系了Apple的代码级支持,向他们发送了示例代码,并且他们已经确认问题存在,并且告诉我要提交错误报告。我在两个月前提交了一份错误报告,但直到现在它仍然未分类,我猜这意味着没有人看过它。

2017年1月31日编辑

苹果已经修复watchOS3.2测试1.这个问题我一直都在模拟器和真正的手表测试它。一切都很好,没有内存泄漏或性能下降了。最终没有解决这个问题的方法,直到他们决定解决这个问题。

回答

4

苹果已经解决了watchOS3.2 beta 1中的问题。我一直在模拟器和真正的手表上测试它。一切都很好,没有内存泄漏或性能下降了。最终没有解决这个问题的方法,直到他们决定解决这个问题。

0

我注意到,使用本机日历并发症我所做的一切变得非常缓慢。所以也许这是新手表操作系统中的一个错误。 使用日历复杂功能几天后,不可能使用该表盘。即使我换成其他复杂功能并切换回日历,它也不会“重置”性能。解决的唯一问题是重新启动手表。 (或忘记日历并改用其他并发症)

+0

我注意到,如果我使用时间旅行,在表面活动一段时间后,米老鼠表盘似乎开始跳帧。我会尝试禁用日历并发症,看看是否仍然发生。如果问题与我在应用程序中注意到的情况相同,那么只需要终止并重新启动日历应用程序即可,而不必重新启动整个手表。 – Marconelly

+0

我找到了一个“解决方案”,所以你不必重新启动。我只是访问我的iPhone上的日历选项,并改变类似于自定义,然后回到镜像。它似乎重置了性能,但它不能解决问题。 –

+0

其实我真正的解决方案是使用名为EventsWidget的应用程序。它有一个很好和简单的日历并发症,工作顺利。 –