更新复杂功能会逐渐降低 watchOS3 中 Apple Watch 应用程序的性能
Updating the complication gradually degrades the Apple Watch app performance in watchOS3
我已经为这个问题强调了大约一个星期,试图找出缓慢但稳定的 Apple Watch 应用程序性能下降的根源。在大约两天的时间里,我的应用程序 UI 会变得越来越缓慢。我已将其缩小为并发症更新代码。即使我将并发症更新减少到绝对最低限度,这个问题仍然会发生,尽管比我用一些实际数据更新并发症要慢。我每 10 分钟更新一次并发症。一旦新数据来了,我就直接执行
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 速度明显变慢。
其他一些注意事项:
如果我不更新复杂功能,应用程序的 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 日编辑
Apple 已在 watchOS3.2 beta 1 中修复该问题。我已经在模拟器和真表上对其进行了测试。一切都运行良好,不再有内存泄漏或性能下降。最后,在他们决定修复它之前,没有任何解决方法。
我注意到使用本机日历复杂功能,我所做的一切都变得非常缓慢。所以也许这是新手表 OS 中的一个错误。
使用日历复杂功能几天后,就无法使用该表盘了。即使我更改为另一种并发症并切换回日历,它也不会 "reset" 性能。唯一能解决的就是重启手表。 (或者忘记日历并使用其他并发症)
Apple 已在 watchOS3.2 beta 1 中修复了该问题。我已经在模拟器和真表上对其进行了测试。一切都运行良好,不再有内存泄漏或性能下降。在他们决定修复它之前,最终没有解决这个问题的方法。
我已经为这个问题强调了大约一个星期,试图找出缓慢但稳定的 Apple Watch 应用程序性能下降的根源。在大约两天的时间里,我的应用程序 UI 会变得越来越缓慢。我已将其缩小为并发症更新代码。即使我将并发症更新减少到绝对最低限度,这个问题仍然会发生,尽管比我用一些实际数据更新并发症要慢。我每 10 分钟更新一次并发症。一旦新数据来了,我就直接执行
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 速度明显变慢。
其他一些注意事项:
如果我不更新复杂功能,应用程序的 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 日编辑
Apple 已在 watchOS3.2 beta 1 中修复该问题。我已经在模拟器和真表上对其进行了测试。一切都运行良好,不再有内存泄漏或性能下降。最后,在他们决定修复它之前,没有任何解决方法。
我注意到使用本机日历复杂功能,我所做的一切都变得非常缓慢。所以也许这是新手表 OS 中的一个错误。 使用日历复杂功能几天后,就无法使用该表盘了。即使我更改为另一种并发症并切换回日历,它也不会 "reset" 性能。唯一能解决的就是重启手表。 (或者忘记日历并使用其他并发症)
Apple 已在 watchOS3.2 beta 1 中修复了该问题。我已经在模拟器和真表上对其进行了测试。一切都运行良好,不再有内存泄漏或性能下降。在他们决定修复它之前,最终没有解决这个问题的方法。