1

從以下數據中,ClockKit會生成一次未來的CLKComplicationTimelineEntry項目,但對於過去的時間點,將會有24個呼叫!爲什麼是這樣?使用手錶併發症和時間旅行,常常調用getTimelineEntriesForComplication

更多細節:

我注意到在我的Apple關注複雜奇怪的行爲。

它支持時間旅行 - 我提供過去1天,未來4天的數據。我目前正在努力成爲一名優秀的公民,並減少撥打電話以重新生成我的複雜數據。

爲了得到一個想法一定呼叫的方式常發,我把一個簡單的printgetTimelineEntries(for:before:limit:withHandler:)getTimelineEntries(for:after:limit:withHandler:)輸出的before/after裏面的參數。

當我啓動在模擬器的應用/併發症,我得到下面的輸出:

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) 
+0

什麼版本的watchOS?你正在重新載入你的時間表還是你在延長它?您每次通話返回多少個時間表條目? 「你是什麼意思?」我目前正在努力成爲一名優秀的公民,並使發燒呼籲**再生**我的併發症數據。「您的數據源不是使用現有的靜態模型,而只是返回請求的時間線條目? (提供一些代碼將有助於回答一些問題,並且可能仍然是必要的。) – 2016-07-23 14:01:13

回答

1

有沒有規定,你的數據源的方法纔會被調用一次。您只需準備好處理請求。

爲什麼它處理過去的條目與將來的條目不同?

我相信這是一個優化,旨在優先考慮即將到來的時間表條目(最近的條目)。

回到watchOS 2.0.1,複雜服務器首先在時間軸中填入未來的條目,然後進入backfill the timeline with past entries。 Apple當然可以選擇批量過去的條目來優先考慮更近距離的條目,這當然是可以理解的。

雖然蘋果自那時以來肯定調整了自己的代碼,但它可能會在當前版本的watchOS中持續應用同樣的關注度和細節。

如果這對我來說是一個昂貴的操作,該怎麼辦?

如果您必須做的不僅僅是簡單地使用現有的複雜度數據,而且您的數據檢索與系統制定的特定請求相關聯,那麼您應該重構該代碼以將其移到該方法之外。

一般來說,您希望預取的數據已經存在,可以直接轉換爲時間線條目。

當你是not merely updating a complication時,這在watchOS 3中變得更加重要,但是在後臺更新你的應用程序。即使您現在仍然需要支持watchOS 2,您應該設計如何獲取數據並更新複雜性,以查看watchOS 3如何完成更新您的整個應用程序。

爲什麼它會多次調用我的數據源方法?

Apple使用各種技術來優化複雜服務器(或操作系統的其他部分)的工作方式。你所能做的就是相信系統被調整來減少它的內存和能量使用,並且它有一個很好的原因。

這實際上是多年的標準做法,並且在UITableViewDataSource中常見,其中有一種方法,如numberOfSectionsInTableViewmight be called several times

正如另一張海報所寫,一個方法的調用次數爲can change between different versions of the OS

如果是一個錯誤怎麼辦?

它可能按照預期工作,但如果您認爲這是一個錯誤,您可以創建一個最小示例項目並使用bug report to Apple提交。

關於時間旅行的無關注

我注意到,你要提供4天未來的時間旅行的條目。這將超過時間滑動窗口。

出於效率的考慮,你可能要考慮latestTimeTravelDate

在構建你的時間表,在此日期之後不會產生任何條目。這樣做會浪費時間,因爲這些條目不會立即顯示。

+1

謝謝!關於'latestTimeTravelDate'的好消息也立即執行。行爲似乎已經停止。無法分辨這是我身邊的bug還是watchOS決定不更新。自那以後,我嘗試優化併發症日期條目的數量,並將更新之間的時間增加到每天約4次。 – oelna