2012-07-20 41 views
4

我有一个NSManagedObject类,具有updatedOn属性。我希望能够实现这个逻辑,以便在课程的willSave方法中设置它的值。当我试图做到这一点时,我发现willSave永远不会被我的这个类的实例调用。NSManagedObject的willSave不会被无效对象调用

经过一番调查,我确定willSave方法没有被调用新创建的实例,其中updatedOn未初始化为任何值。由于此属性未设置为可选,因此验证失败,并且显然只有实例有效时才会调用该方法。

我的问题是这样的:有做这种事情的最佳做法吗?我是否需要使updatedOn属性成为可选项才能解决此问题?或者我应该实现我的课程的awakeFromInsert方法在那里设置初始值,然后在最终调用willSave方法时覆盖该值?还是有一些更简单的方法更有意义?

回答

6

willSave文档提到了使用时间戳方法,尽管提到了改变属性值和递归的一些复杂性,但它并没有针对此用途提出具体警告。所以我想,基于这个事实,它可以被认为是一个合理的地方来把这个功能。

但是,文档确实指的是使用NSManagedObjectContextWillSaveNotification来计算常见时间戳,所以也许这将是这项工作的替代位置。这需要手动检查managedObjectContext上的insertedObjectsupdatedObjects集合以找到需要时间标记的对象,但是基于某些快速测试,它似乎在验证步骤之前调用,因此您将有机会设置所需的属性这里。

如果你选择坚持willSave那么我猜你有3个选择。

  • 模型中具有指定默认值的必需属性。
  • 必需的属性,其属性设置在awakeFromInsert或其他合适的点上。
  • 可选属性。

我觉得任何的选择是合理的选择,但我想,如果是我的话,我可能会选择了NSManagedObjectContextWillSaveNotification因为并发症只是在willSave设置属性值。

+0

感谢您的答案Rory ...我曾考虑过使用NSManagedObjectContextWillSaveNotification,但它似乎不太合适,因为只有一个实体需要时间戳,而且我会通过一组相当大的对象来搜索异味,以找到相对较少的我需要。我决定使用在awakeFromInsert中设置的必需属性,并在willSave中再次设置。这是一个轻微的烦恼,我必须将它放在两个位置,但它似乎是我可以使用的最佳方式。 – 2012-07-21 21:55:04