【问题标题】:NSManagedObject's willSave not being called for invalid objectNSManagedObject 的 willSave 没有被无效对象调用
【发布时间】:2012-07-20 03:33:12
【问题描述】:

我有一个带有updatedOn 属性的 NSManagedObject 类。我希望实现在类的willSave 方法中设置其值的逻辑。当我尝试这样做时,我发现 willSave 从未在我的此类实例上被调用。

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

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

【问题讨论】:

    标签: objective-c ios core-data iphonecoredatarecipes


    【解决方案1】:

    willSave 文档提到了使用时间戳的方法,尽管提到了更改属性值和递归的一些复杂性,但它并没有特别警告不要使用这种方法。所以我想,基于这个事实,它可以被认为是放置这个功能的合理位置。

    但是,文档确实提到了使用NSManagedObjectContextWillSaveNotification 来计算公共时间戳,因此也许这将是这项工作的替代位置。它需要手动检查managedObjectContext 上的insertedObjectsupdatedObjects 集合以定位需要时间戳的对象,但根据一些快速测试,它似乎在验证步骤之前被调用,所以你会有一个有机会在这里设置所需的属性。

    如果您选择坚持使用willSave,那么我想您有 3 个选项。

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

    我认为任何选项都是合理的选择,但我认为如果是我,我可能会选择 NSManagedObjectContextWillSaveNotification,因为在 willSave 中设置属性值很复杂。

    【讨论】:

    • 感谢罗里的回答...我曾考虑过使用 NSManagedObjectContextWillSaveNotification 但它似乎不太合适,因为我只有一个实体需要时间戳,而且每次保存时我都会搜索一组相当大的对象气味找到我需要的相对较少的东西。我决定使用在 awakeFromInsert 中设置并在 willSave 中再次设置的必需属性。我必须将它设置在 2 个地方有点烦人,但这似乎是我可以使用的最佳方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    相关资源
    最近更新 更多