上图是我模型的简化版。我的应用程序有一个NSWindowController
对象,控制两个NSViewController
对象,分别用于用户和账户实体。当用户登录应用程序时,他们可以通过调用相关的视图控制器来修改用户或账户信息。在后台,我让应用程序定期在单独的线程上填充用户日志。
我正在为后台线程使用单独的NSManagedObjectContext
,并为视图控制器中的数据输入使用应用程序委托的NSManagedObjectContext
。我想知道以下几点:
1)这种做法好吗?我应该为每个视图控制器创建一个NSManagedObjectContext
,然后在用户完成更改后合并上下文吗?
2)因为日志实体是在后台线程中创建的,它有自己的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
是否线程安全?在获取用户时,我需要锁定主要的管理对象上下文以防止其中一个视图修改同一用户吗?从这篇文章中,我了解到(也许不正确),我可能需要这样做。到目前为止,我还没有遇到任何问题,但我不想留下潜在的边缘情况。3)当其中一个视图控制器更改应用程序委托的
NSManagedObjectContext
时,它会发布一个通知,如下所示处理:- (void)contextDidSave:(NSNotification *)notification {
SEL selector = @selector(mergeChangesFromContextDidSaveNotification:);
[self.logManagedObectContext performSelector:selector onThread:backgroundThread withObject:notification waitUntilDone:NO];
}
我应该如何处理合并操作?是应该合并应用程序代理的NSManagedObjectContext
还是其他方式?我发现这样做(在主线程上)会锁定用户界面。
任何帮助将不胜感激。