2012-01-10 47 views
1

我想創建一個應用程序,該應用程序在我慢跑並使用Core Data存儲信息時進行記錄。我想存儲每次鍛鍊的日期,距離和跑步時間。我也希望能夠顯示一個摘要,其中包含我已經運行的總次數和總運行距離。如何使用KVO更新屬性

在我的設計中,我可以直接從鍛鍊對象顯示摘要。我已經跑了多少次,只是鍛鍊對象的數量,我可以總結每次鍛鍊的距離,以獲得總跑步距離。但是,我認爲第二個操作的成本太高,因爲每次我想要顯示該數據時都必須掃描整個數據庫(這與iTunes中的問題相同,因此您需要顯示音樂的總時數設備)。每次應用程序午餐時,我都可以將這些信息存儲在一個屬性中,但我想這會導致啓動緩慢。因此,我認爲我寧願有2個coredata對象總結和鍛鍊:

+---------------------+     +---------------------+ 
|Summary    |     |Workout    | 
+---------------------+     +---------------------+ 
|totalDistance  | <--------------->> |date     | 
|totalAmountOfWorkouts|     |distance    | 
+---------------------+     |time     | 
              +---------------------+ 

現在,它來了這個問題。如何更新摘要?

我可以手動更新totalDistance和totalAmountOfWorkouts。我想象實現某種updateWorkout方法,每次創建一個新的鍛鍊時都會觸發它。但是,我知道Coredata已經具備觀察功能,並且可以告訴我什麼時候插入了一個新的Workout對象,並且我可以更新Summary:KVO。我從來沒有使用過KVO,我想知道這是否適合使用KVO?但是,你是怎麼做的?實際上,KVO是解決此問題的最佳方法,還是應該在鍛鍊中實施協議並將摘要指定爲委託?我非常記得聽說KVO模式很難調試。

彙總,我的問題是:

Q1:我應該得到totalDistance直接掃描數據庫?問題12:我應該使用KVO還是委託模式?
問題3:totalDistance如何更新?

回答

1

使用最簡單的API。假設您有一組獲取的鍛鍊。那麼只需做

float distance = [[fetchedObjects valueForKeyPath: @"@sum.distance"] floatValue] 

只有當這不符合您的性能要求,考慮KVO或其他機制來緩存距離值。如果性能可以接受,實時計算總是優於緩存。但是我發現很難相信CoreData無法處理一生中實際可以做的鍛鍊數量。

+0

你會以同樣的方式解決問題的iTunes(小時的音樂量)的例子嗎? – Alvaro 2012-01-10 14:44:05

+0

如果我有CoreData中的所有跟蹤信息,我肯定會試試! – 2012-01-10 15:58:04

+0

而不是執行@ sum.distance技巧。我遍歷每個Workout.distance值 – Alvaro 2012-01-10 21:01:01