我一直在關注這個問題大約一週,試圖指出緩慢而穩定的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.這個問題我一直都在模擬器和真正的手錶測試它。一切都很好,沒有內存泄漏或性能下降了。最終沒有解決這個問題的方法,直到他們決定解決這個問題。
我注意到,如果我使用時間旅行,在表面活動一段時間後,米老鼠錶盤似乎開始跳幀。我會嘗試禁用日曆併發症,看看是否仍然發生。如果問題與我在應用程序中注意到的情況相同,那麼只需要終止並重新啓動日曆應用程序即可,而不必重新啓動整個手錶。 – Marconelly
我找到了一個「解決方案」,所以你不必重新啓動。我只是訪問我的iPhone上的日曆選項,並改變類似於自定義,然後回到鏡像。它似乎重置了性能,但它不能解決問題。 –
其實我真正的解決方案是使用名爲EventsWidget的應用程序。它有一個很好和簡單的日曆併發症,工作順利。 –