核心数据:检测孩子何时被删除

时间:2015-11-09 16:10:12

标签: ios core-data

在我的应用中,我有一个Result实体,可以包含多个Expense实体。

每个Expense都有一个金额,而我的Result包含费用的总和。

我需要在添加或删除Expense时自动计算总和。

添加Expense后,我已成功完成此操作,从didChangeValueForKey Expense覆盖NSManagedObject。但是,即使在删除生效时调用该方法,对Result对象的引用也为零。我有一个想法,使用willChangeValueForKey存储我的Result对象的引用,但我觉得这很脏。

您是否有更好的想法,以便在删除其中一个子项时通知Result对象?

3 个答案:

答案 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 }
}