Multithreading 核心数据读取线程中的数据';s添加到主线程中

Multithreading 核心数据读取线程中的数据';s添加到主线程中,multithreading,core-data,nsmanagedobjectcontext,nspersistentdocument,Multithreading,Core Data,Nsmanagedobjectcontext,Nspersistentdocument,我有一个基于Mac文档的应用程序,使用NSPersistentDocument作为文档模型 创建新文档时,应用程序会在initiWithType方法中将一些默认数据(几个运动对象和用户数据)添加到文档中 - (id)initWithType:(NSString *)typeName error:(NSError **)outError { self = [super initWithType:typeName error:outError]; NSManagedObjectContext *m

我有一个基于Mac文档的应用程序,使用NSPersistentDocument作为文档模型

创建新文档时,应用程序会在initiWithType方法中将一些默认数据(几个运动对象和用户数据)添加到文档中

- (id)initWithType:(NSString *)typeName error:(NSError **)outError {
self = [super initWithType:typeName error:outError];

NSManagedObjectContext *managedObjectContext = [self managedObjectContext];

[[SportManagement sharedManager] addDefaultSports:managedObjectContext];
[[UserManagement sharedManager] addDefaultUser:managedObjectContext];

[managedObjectContext processPendingChanges];

return self;
}

该应用程序有一个导入功能,可以从一些硬件导入数据,这些硬件在线程中运行,我将其设置如下(managedObjectContext是NSPersistentDocument的内容):

数据从硬件导入到许多NSManagedDataObject项中。每个ManagedObject都有一个“Sport”字段,需要使用创建文档时创建的一个Sport对象填充该字段

但是,在线程(moc)的新ManagedObjectContext中不存在添加到
-(id)initWithType:(NSString*)typeName错误:(NSError**)outError
中的运动对象

如果我运行应用程序,创建一个新文档,然后让应用程序闲置一分钟左右,然后尝试导入,那么运动对象确实存在于线程管理的对象上下文中

如何将线程中的新ManagedObjectContext与NSPersistantDocument中的主ManagedObjectContext同步

我尝试过:
[managedObjectContext processPendingChanges]
[managedObjectContext集合talenessinterval],但两者似乎都不能解决此问题

有趣的是,这在Mac OS X 10.8中似乎没有发生,只有在10.7中,设置“主”MOC以接收
NSManagedObjectContextDidSaveNotification
通知,并在后台MOC保存时合并更改
-mergeChangesFromContextDidSaveNotification:

编辑

好的,看起来您已经在主运行中心中进行了更改,但这只是一个草稿。在数据实际保存到持久性存储之前,持久性存储不知道新的数据更改

因此,当您创建其他MOC并将其连接到PSC时,它不知道这些更改

您可以知道autosave何时启动,因为“一段时间后”它会工作


创建初始内容后,我会尝试手动保存文档。

我已经在应用程序中获得了该内容,但这是为了将线程中添加的数据恢复到主线程中。我想做的是在主线程中获取已经添加到文档ManagedObjectContext的数据,以显示在新线程的新ManagedObjectContext中。然后我感到困惑,因为现在,当我一起阅读您的问题和注释时,我甚至无法想象您描述的场景。也就是说,你在评论中的最后一句话是什么意思?你能详细说明一下吗(可能还有导致问题的实际代码)。
dispatch_async(dispatch_get_global_queue(0, 0), ^ {

    NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSConfinementConcurrencyType];
    [moc setPersistentStoreCoordinator:[managedObjectContext persistentStoreCoordinator]];