2017-10-16 121 views
0

我有一個包含零個或多個「鍛鍊」的實體「日」的核心數據模型。當天實體擁有大量的財產,這些財產是通過總結所有的鍛鍊來計算的。例如,totalKM將所有鍛鍊的km屬性值相加。基於核心數據中基礎實體屬性的計算屬性

我只是不能得到這個工作。

我可以得到總計通過重寫值出現(forKey)方法:

public override func value(forKey key: String) -> Any? { 
    if(key == "swimSeconds"){ 
     var swimSeconds: Int64 = 0 
     if let array = workouts?.allObjects{ 
      for w in array{ 
       let workout: Workout = w as! Workout 
       if (workout.sport == Workout.SPORT.Swim.rawValue){ 
        swimSeconds += workout.seconds 
       } 
      } 
     } 
     return swimSeconds 
    }else{ 
     return super.value(forKey: key) 
    } 
} 

然而,這意味着如果底層鍛鍊被改變,這是不反映在在日總所示的值實體。此外,它只是覺得這不是正確的做法 - 我不應該重寫此方法。

我已經嘗試使用Xcode創建NSManagedObject子類,但創建了所有@NSManaged變量的擴展,但這只是給出了大量的錯誤「擴展可能不包含存儲的屬性」,它只能通過刪除@NSManaged進行修復。

我試圖創造我自己擴展到日,並有一個屬性只有一個getter:

var totalSwimSeconds: Int64{ 
    get{ 
     var swimSeconds: Int64 = 0 
     if let array = workouts?.allObjects{ 
      for w in array{ 
       let workout: Workout = w as! Workout 
       if (workout.sport == Workout.SPORT.Swim.rawValue){ 
        swimSeconds += workout.seconds 
       } 
      } 
     } 
     return swimSeconds 
    } 
} 

這種方法產生的運行時錯誤: 實體的日子並不鍵值爲重點順應編碼,「 totalSwimSeconds「

我在網上搜索瞭解我是否可以找到這個例子,但所有的例子都是在給定實體內組合屬性的簡單情況(例如,來自DOB的年齡,姓和名的全名)一個更復雜的計算來看待其他實體中包含的屬性。

如何在覈心數據中創建計算屬性,這些屬性將從基礎實體計算並在更新時進行更新?

[我使用的Xcode 9夫特4]

+0

「兼容的編碼不鍵值」 什麼行代碼給你? –

+0

我有一個文本字段綁定到Day實體數組控制器選擇與模型關鍵路徑totalSwimSeconds - 我相信這是導致運行時異常。對於SWIFT和xCode來說,這是非常新的,所以我可能會錯過如何深入研究這個錯誤。 –

回答

0

在夫特4添加屬性@objcdynamic和使所計算的屬性的鍵 - 值編碼兼容。

@objc dynamic var totalSwimSeconds: Int64 { ... 

編輯:

觀察workouts屬性重寫keyPathsForValuesAffectingValueDay

override class func keyPathsForValuesAffectingValue(forKey key: String) -> Set<String> { 
    switch key { 
    case "totalSwimSeconds": return Set(["workouts"]) 
    default: return super.keyPathsForValuesAffectingValue(forKey:key) 
    } 
} 
+0

謝謝。這是一個很大的區別。該物業現在正確顯示。當底層的鍛鍊實體中的值發生更改時,它仍然不會更新。 –

+0

您可以實現類方法['keyPathsForValuesAffectingValueForKey'](https://developer.apple.com/documentation/objectivec/nsobject/1414299-keypathsforvaluesaffectingvaluef)以獲得一個簡單的鍵值,觀察 – vadian

+0

再次感謝。我會放棄這一點。 –