核心数据和托管对象上下文
Posted
技术标签:
【中文标题】核心数据和托管对象上下文【英文标题】:Core Data and Managed Object Contexts 【发布时间】:2011-12-16 23:47:14 【问题描述】:我是 Core Data 的新手,我对如何以正确的方式做事有一些疑问。我想我需要一个临时管理对象上下文来处理临时实体,而用户正在编辑一个新实体。当用户点击保存该数据时,我想将这些实体插入persistedManagecObjectContext,然后保存上下文。实现这一目标的最佳实践是什么?由于我不想保存在临时上下文中,所以必须使用线程?
感谢您的知识!
【问题讨论】:
我没有时间写一个完整的答案,但你可以尝试使用这里描述的多上下文核心日期cocoanetics.com/2012/07/multi-context-coredata 【参考方案1】:您需要将临时 ManagedObjectContext (MOC) 中的更改合并到持久化中。这是我如何实现这一目标的一个例子。 我使用线程(每个线程一个 MOC),但我很确定没有线程也可以正常工作。
您调用此方法将更改保存在 tempMOC 中:
- (void) saveNewEntry
NSNotificationCenter *dnc = [NSNotificationCenter defaultCenter];
// Subscribe to "NSManagedObjectContextDidSaveNotification"
// ..which is sent when "[tempMOC save];" is called.
[dnc addObserver: self
selector: @selector(mergeChanges:)
name: NSManagedObjectContextDidSaveNotification
object: tempMOC];
// Save changes
[tempMOC save];
// Remove subscribtion
[dnc removeObserver: self
name: NSManagedObjectContextDidSaveNotification
object: tempMOC];
...这将触发通知:
- (void) mergeChanges: (NSNotification*) saveNotification
// If youre using threads, this is necessary:
[self performSelectorOnMainThread: @selector(mergeToMainContext:)
withObject: saveNotification
waitUntilDone: NO];
// ...otherwise, you could do the merge in this method
// [persistedMOC mergeChangesFromContextDidSaveNotification: saveNotification];
...依次调用:
- (void) mergeToMainContext: (NSNotification*) saveNotification
[persistedMOC mergeChangesFromContextDidSaveNotification: saveNotification];
【讨论】:
【参考方案2】:我有同样的问题(编辑器需要一个对象,所以创建......但如果取消,扔掉那个对象)。不过,我最终采用了一种更暴力的方法,正是为了避免所有多个对象上下文和合并:
我在所有对象中都使用了“is temp”字段。当我需要创建一个“临时”对象时,我的数据层中有一个方法可以正常创建一个对象,然后在返回之前翻转 isTemp=true。
然后,在我的“对象编辑器”onCancel 中有:
if (obj.isTemp)
[context deleteObject: ... ];
onSave 是:
if (obj.isTemp) obj.isTemp = NO;
[context saveAsUsual...];
注意:这里没有解决在用户确认保存之前不将“丢弃”更改复制到现有对象的问题。否则,当其他代码保存共享上下文时,更改将像特洛伊木马一样坐在那里等待应用。
【讨论】:
以上是关于核心数据和托管对象上下文的主要内容,如果未能解决你的问题,请参考以下文章