0

我有一个基于 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 中不存在任何已添加的运动对象。

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

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

我试过:[managedObjectContext processPendingChanges];[managedObjectContext setStalenessInterval];,但似乎都不能解决这个问题。

有趣的是,这似乎不会在 Mac OS X 10.8 中发生,仅在 10.7 中发生

4

1 回答 1

1

设置您的“主” MOC 以接收NSManagedObjectContextDidSaveNotification通知,并在后台 MOC 保存时合并更改-mergeChangesFromContextDidSaveNotification:

编辑

好的,看起来您已经在 MOC 中进行了更改,但它只是一个暂存器。在数据实际保存到持久存储之前,持久存储不知道新的数据更改。

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

您可以知道自动保存何时启动,因为“过一段时间”它会起作用。

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

于 2012-09-12T20:49:20.663 回答