在我的应用中,我有一个Result
实体,可以包含多个Expense
实体。
每个Expense
都有一个金额,而我的Result
包含费用的总和。
我需要在添加或删除Expense
时自动计算总和。
添加Expense
后,我已成功完成此操作,从didChangeValueForKey
Expense
覆盖NSManagedObject
。但是,即使在删除生效时调用该方法,对Result
对象的引用也为零。我有一个想法,使用willChangeValueForKey
存储我的Result
对象的引用,但我觉得这很脏。
您是否有更好的想法,以便在删除其中一个子项时通知Result对象?
答案 0 :(得分:1)
我建议您像这样收听NSManagedObjectContextObjectsDidChangeNotification:
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(dataModelHasChanged:)
name:NSManagedObjectContextObjectsDidChangeNotification
object:managedObjectContext];
每次发生变化时,您都可以通过这种方式检测到它:
- (void)dataModelHasChanged:(NSNotification *)notification
{
NSSet *updatedObjects = [[notification userInfo] objectForKey:NSUpdatedObjectsKey];
NSSet *deletedObjects = [[notification userInfo] objectForKey:NSDeletedObjectsKey];
NSSet *insertedObjects = [[notification userInfo] objectForKey:NSInsertedObjectsKey];
// Do something in response to this
}
答案 1 :(得分:0)
我认为Result
中的总和应该是计算属性。将总和存储在数据库中似乎是多余的。
请注意,使用KVC可以非常有效:
let sum = self.expenses.valueForKeyPath("@sum.amount")
答案 2 :(得分:0)
或者,您可以将计算属性添加到Expenses
并在那里管理所需的副作用。
@NSManaged private var storedAmount: NSNumber
var amount: NSNumber {
set {
amount = newValue
storedAmount = amount
// do your computation and update Result
}
get { return storedAmount }
}