我有一个基于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的那个):
dispatch_async(dispatch_get_global_queue(0, 0), ^ {
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSConfinementConcurrencyType];
[moc setPersistentStoreCoordinator:[managedObjectContext persistentStoreCoordinator]];
数据从硬件导入到许多NSManagedDataObject项中。每个ManagedObject都有一个“Sport”字段,需要使用创建文档时创建的一个运动对象填充该字段。
但是,- (id)initWithType:(NSString *)typeName error:(NSError **)outError
中添加的运动对象都不存在于线程(moc)中的新ManagedObjectContext中。
如果我运行应用程序,创建一个新文档,然后让应用程序闲置一分钟左右,然后尝试导入,然后运行对象DO存在于线程托管对象上下文中。
如何将线程中的新ManagedObjectContext与NSPersistantDocument中的主ManagedObjectContext同步?
我尝试过:[managedObjectContext processPendingChanges];
和[managedObjectContext setStalenessInterval];
,但似乎都没有解决这个问题。
有趣的是,这似乎不是在Mac OS X 10.8中发生的,仅在10.7
中答案 0 :(得分:1)
设置“主要”MOC以接收NSManagedObjectContextDidSaveNotification
次通知,并在后台MOC保存为-mergeChangesFromContextDidSaveNotification:
时合并更改。
修改强>
好的,看起来你已经在MOC中进行了更改,但它只是一个暂存器。在数据实际保存到持久性存储之前,持久性存储不知道新数据的更改。
因此,当您创建其他MOC并将其连接到PSC时,它不知道这些更改。
你可以知道自动保存什么时候开始,因为“过了一会儿”就可以了。
在创建初始内容后,我会尝试手动保存文档。