上面是对我的模型的简化。我的应用程序有一个NSWindowController
对象控制用户和帐户实体的两个NSViewController
对象。当用户登录到应用程序时,他们可以通过调出相关的视图控制器来修改用户或帐户信息。在后台,我有应用程序定期将用户的日志填充到单独线程上的应用程序委托中。
我使用单独的NSManagedObjectContext
作为后台线程和应用程序委托的NSManagedObjectContext
用于视图控制器中的数据输入。我想知道几件事情:
1)这是一个很好的做法吗?我应该为每个视图控制器创建一个NSManagedObjectContext
,然后在用户完成更改时合并上下文吗?
2)因为log实体是在后台线程中创建的,所以它有它自己的NSManagedObjectContext
。但是,每个日志包括来自用户和帐户实体的信息,这些信息是在应用程序代理的NSManagedObjectContext
中创建的。这是怎么了获取用户:
- (NSManagedObjectID*) fetchUser:(NSString*) userID {
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"user":inManagedObjectContext:self.managedObjectContext];
/** snip **/
}
此方法由后台线程调用如下:
NSManagedObjectID* userObjectID = [self fetchUser:userID];
NSManagedObject* userObject = [self.logsManagedObjectContext objectWithID:userObjectID];
是我在fetchUser
线程安全的我在做什么?如果其中一个视图正在修改同一用户,那么在获取用户时是否需要锁定主管理对象上下文?从this article我了解(也许不正确),我可能必须这样做。到目前为止,我没有遇到任何问题,但我不想留下潜在的优势案例。
3)当视图控制器之一,使更改应用程序委托的NSManagedObjectContext
其职位,被处理的通知如下:
- (void)contextDidSave:(NSNotification *)notification {
SEL selector = @selector(mergeChangesFromContextDidSaveNotification:);
[self.logManagedObectContext performSelector:selector onThread:backgroundThread withObject:notification waitUntilDone:NO];
}
这是我应该如何处理合并或者我应该合并应用程序代理的NSManagedObjectContext
而不是?我发现这样做(在主线程上)锁定了用户界面。
任何帮助将不胜感激。
我不知道我可以从后台MOC中检索用户。我需要做的就是给他们相同的** NSPersistentStoreCoordinator **?如果我这样做,我需要检索使用对象ID或我可以直接获取对象? – David 2010-12-23 23:33:25
您可以直接获取对象。只要确保编写代码以合并来自共享相同协调器的其他MOC的通知时的更改。 – paulbailey 2010-12-30 11:04:10