基于核心数据中基础实体属性的计算属性
我有一个包含零个或多个“锻炼”的实体“日”的核心数据模型。当天实体拥有大量的财产,这些财产是通过总结所有的锻炼来计算的。例如,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]
在夫特4添加属性@objc
dynamic
和使所计算的属性的键 - 值编码兼容。
@objc dynamic var totalSwimSeconds: Int64 { ...
编辑:
观察workouts
属性重写keyPathsForValuesAffectingValue
在Day
override class func keyPathsForValuesAffectingValue(forKey key: String) -> Set<String> {
switch key {
case "totalSwimSeconds": return Set(["workouts"])
default: return super.keyPathsForValuesAffectingValue(forKey:key)
}
}
谢谢。这是一个很大的区别。该物业现在正确显示。当底层的锻炼实体中的值发生更改时,它仍然不会更新。 –
您可以实现类方法['keyPathsForValuesAffectingValueForKey'](https://developer.apple.com/documentation/objectivec/nsobject/1414299-keypathsforvaluesaffectingvaluef)以获得一个简单的键值,观察 – vadian
再次感谢。我会放弃这一点。 –
“兼容的编码不键值” 什么行代码给你? –
我有一个文本字段绑定到Day实体数组控制器选择与模型关键路径totalSwimSeconds - 我相信这是导致运行时异常。对于SWIFT和xCode来说,这是非常新的,所以我可能会错过如何深入研究这个错误。 –