将 `lastModified` 记录添加到 Core Data 托管对象
Posted
技术标签:
【中文标题】将 `lastModified` 记录添加到 Core Data 托管对象【英文标题】:Adding a `lastModified` record to a Core Data managed object 【发布时间】:2013-03-18 00:00:06 【问题描述】:一个对象需要提交到服务器,我想通过显示lastModified
日期/时间和lastSubmitted
日期/时间来向用户表明该对象需要提交。
(是的,必须手动提交记录。)
我目前正在监听NSManagedObjectContextObjectsDidChangeNotification
,检查对象的实体是否为RetailLocation
,如果是,则设置其lastModified
日期/时间(当然,仅当lastModified
不是唯一的属性时修改的)。由于这似乎使撤消管理器高度混淆,我使用performSelector:SOMESEL withObject:retailLocation afterDelay:0.0
来设置lastModified
属性。
遗憾的是,这几乎更糟:这会导致两个操作被添加到撤消堆栈中!
有人可以推荐一种在 Core Data 管理的记录中实现 lastModified
属性的好方法吗?或者,我错过了什么?
【问题讨论】:
在此处查看 Martin R 对类似问题的回答:***.com/questions/20098544/…。该解决方案对我来说非常有效。 【参考方案1】:如果您不希望修改日期不可撤销,您可以在进行更改之前调用 NSUndoManager 上的disableUndoRegistration
,并在完成后调用enableUndoRegistration
。
如果你需要一个,你可以通过在你的 NSManagedObjectContext 上调用 undoManager
来获得一个指向 NSUndoManager 的指针,但是如果你在 ios 中工作,你应该已经有了一个。
另外,请注意 Apple 建议为此使用 NSManagedObjectContextWillSaveNotification
通知,因为不一定会保存更改。
【讨论】:
我在 OS X 上使用NSPersistentDocument
的撤消管理器(与NSManagedObjectContext
相同)。禁用撤消注册似乎没有帮助,但这不是理想的选择无论如何解决;如果用户执行撤消,修改时间和动作都应该在同一个撤消操作中撤消。理想情况下,这将通过撤消组来完成,但这不是一个选项,考虑到 Core Data 是根据 Cocoa 绑定触发的更改向撤消堆栈添加操作的选项,这些更改是基于主运行循环中的用户输入触发的。 . :/
我会选择...WillSaveNotification
解决方案,但用户需要立即看到向服务器提交更新数据是必要的。这组稍微复杂的要求是我选择 SO 的原因;我没有看到一个干净的方法来做到这一点,除了:1)不将修改跟踪集成为核心数据属性,或 2)通过覆盖现有核心数据属性的每个设置器进行跟踪(从而确保跟踪在相同的撤消组)。我不喜欢这两种解决方案。
是的,听起来您可能需要覆盖每个设置器并创建一个新的自定义撤消组。
只是好奇,你最后做了什么?
我仍然坚持使用有缺陷的解决方案,我在堆栈上有两个撤消操作。从来没有考虑将自定义设置器添加到实体的类中,但这是计划好的路线......这很讨厌,但它应该可以工作。以上是关于将 `lastModified` 记录添加到 Core Data 托管对象的主要内容,如果未能解决你的问题,请参考以下文章
在 sqoop 导入语句中使用 Append 和 last modified