2017-10-16 125 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

再次感谢。我会放弃这一点。 –