我有一个基于 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 中发生