Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 是否在NSManagedObjectContext与共享持久存储之间复制挂起的更改?_Objective C_Core Data_Nsmanagedobject_Nsmanagedobjectcontext_Nsoperation - Fatal编程技术网

Objective c 是否在NSManagedObjectContext与共享持久存储之间复制挂起的更改?

Objective c 是否在NSManagedObjectContext与共享持久存储之间复制挂起的更改?,objective-c,core-data,nsmanagedobject,nsmanagedobjectcontext,nsoperation,Objective C,Core Data,Nsmanagedobject,Nsmanagedobjectcontext,Nsoperation,我有两个NSManagedObjectContext的实例:一个用于主线程,另一个用于后台线程(通过NSOperation),用于线程安全,这两个上下文仅共享一个NSPersistentStoreCoordinator 我遇到的问题是,在执行-save之前,第一个上下文(在主线程上)中的挂起更改无法用于第二个上下文。这是可以理解的,因为共享持久化存储不会有被-insertedObjects跟踪的NSManagedObjects,-updatedObjects和-deletedObjects的副本

我有两个
NSManagedObjectContext
的实例:一个用于主线程,另一个用于后台线程(通过
NSOperation
),用于线程安全,这两个上下文仅共享一个
NSPersistentStoreCoordinator

我遇到的问题是,在执行
-save
之前,第一个上下文(在主线程上)中的挂起更改无法用于第二个上下文。这是可以理解的,因为共享持久化存储不会有被
-insertedObjects
跟踪的
NSManagedObjects
-updatedObjects
-deletedObjects
的副本被持久化

不幸的是,这给用户体验带来了问题:任何未保存的更改都不会出现在后台线程中生成的(耗时的)报告中


我能想到的唯一解决办法是:从第一个上下文中获取插入、更新和删除的对象,并将它们移植到第二个上下文的对象图上。数据集中有一些相当复杂的关系,所以我不太愿意朝这个方向走。我希望这里有人能提供更好的解决方案。

如果低于10.7,有一些解决方案:一个是你可以有嵌套的ManagedObjectContext,这样你可以在被修改的一个中“保存”,它不会一直保存到磁盘,但它会使主上下文的其他子级可以使用更改


在10.7之前,您可能需要将更改复制到您自己身上。这并不是很难,因为您可以让单个对象侦听
NSManagedObjectContextObjectsDidChangeNotification
,然后完全从主上下文重新应用更改。(应该是大约20行代码。)我假设您永远不必保存第二个上下文?

不确定您是否有任何操作系统限制,但在iOS 5/Mac OS 10.7中,您可以使用嵌套的托管对象上下文来实现这一点。我相信,子上下文可以通过简单地执行新的获取来引入父上下文中未保存的更改


编辑:看起来像是威尔赢了我,但是是的,在iOS 5/Mac OS 10.7之前,您必须侦听NSManagedObjectContextDidSaveNotification,并查看userInfo字典中添加/更新/删除的对象。

另一种解决方案可能涉及使用单个托管对象上下文,并为访问它提供自己的线程安全,或者使用上下文的锁定和解锁方法

我会尝试让主线程进行正常保存,这样第二个上下文就可以将更改合并到他的上下文中。“对抗”API的预期用途从来不是一个好主意。 您可以使用属性将新保存的记录标记为中间记录,并在用户最终取消编辑时删除

解决实体中的属性问题和使用匹配谓词在后台线程中查询问题将很容易


这也是一个稳定的解决方案。我来自一个数据库驱动的世界(oracle),我们经常使用这种模式(记录中的状态属性)使数据对其他DB会话可见/不可见(这相当于cocoa应用程序中的线程)。工作总是没有问题的。其他线程/会话总是只看到提交的更改,这就是大多数RDBMS的工作方式

谢谢你,威尔!我希望以10.6为目标,尽管这一目标每天都在变得越来越困难:-)--我已经在跟踪更改通知,但我不确定您如何重新应用更改和维护实体关系。你能说得更具体一点吗?啊,是的。我在无形中根据我的模型做出了一个假设,即每个对象都有一个您自己维护的UUID(字符串)键。如果没有后台MOC中的保存,则主MOC将看不到插入内容(没有嵌套的MOC)。如果您侦听更改通知(在processPendingChanges之后发出)并自己更新对象,则现有对象的更新/删除应该可以工作。