2012-02-01 44 views
0

我一直在爲這個問題爭冠,很難總結成一行代碼。我會盡量保持它儘可能直接。優化,是否減少核心數據請求?

我正在開發一個應用程序,我正在顯示一個自定義的UIView(圖表)和一個帶有數據的UITableView。表格視圖中的每一行代表一個具有值的時間點,可以說它的帳戶餘額。

tableview一次只顯示3行,中間行作爲「活動」行。活動行用於決定圖表中顯示的內容。在圖表中顯示12小時前或後的任何賬戶餘額,其時間戳爲<。使圖表顯示24小時的數據窗口。

這就是我正在努力決定什麼是優化和減少在tableview中滾動時的滯後的最佳設計方法。基本上我有通過使用UIScrollView委託方法來確定哪一行在中間的邏輯。這工作正常。

要決定要顯示的數據我每次中間行更改(每次更改行時都會有新的請求),使用謂詞執行NSFetchRequest。完成後,我在圖表視圖上調用setNeedsDisplay並重繪。

儘管目前爲止在小數據集上工作正常,但我有一種直覺,我可以以某種方式更好地利用Core Data的性能和緩存,以更好地減少延遲。任何想法和想法都很受歡迎。

這可能不是一個常見問題,也不是很多人的興趣點,但是我在這裏討論的最佳實踐可能適用於比我更多的情況,因此對更多的人有價值。

+1

您描述的場景看起來像是使用NSFetchedResultsController的完美人選。讓它爲你進行表管理和更新,在需要時獲取對象,並在不使用/顯示在表上時對其進行錯誤檢查等。查看文檔並查看它是否可以幫助你。 – Rog 2012-02-02 01:00:55

回答

0

您可能想要使用的是批量抓取(NSFetchRequest允許您設置批量偏移和大小)。這正是NSFetchedResultsController用來確保它一次只能提取一些對象的原因。

您需要知道需要做的平衡:如果您的批量較大(例如300行/對象),則強制CoreData一次創建300個對象(而不是較小的數量) 。但是,如果將批量大小設置爲小(例如3行/對象),您將付出高昂的代價,因爲您最終會經常批量提取(這非常昂貴)。

您必須測試以查看哪種批量大小適合您,但它通常是您一次顯示的對象數量的兩倍。

當您打開批量抓取(通過設置批量大小)時,NSFetchRequest返回的數組將在背後執行一些魔術,並且只會在遍歷它時填充該數組。而且它只會在目前使用的內容之前和之後將對象保留在內存中。

這很容易誤用批量抓取並使事情變慢。例如。如果你有一個批量抓取的數組,並且你有一些循環遍歷所有對象的(斷開的)邏輯,那麼你最終會逐個拉入集合中的所有批次 - 這就破壞了批量抓取的目的。

+0

是的,我一開始考慮使用NSFetchedResultsController,但猶豫不決。它現在似乎工作得很好。我將不得不做一些基準測試,看Core Data或Core Graphics是否會成爲瓶頸。 (因爲每個rowchange都會觸發圖表重繪,所以它可以是任意一個) 因爲我終於使用了NSFetchedResultsController,所以標記爲解決方案。 – oehman 2012-02-17 19:28:23

+0

請注意,您可以對批處理使用「NSFetchRequest」,這可能會給您更多的靈活性,即專爲表視圖設計的「NSFetchedResultsController」。 – 2012-02-18 09:32:57