Выше упрощено то, как выглядит моя модель. В моем приложении есть объект NSWindowController
, управляющий двумя объектами NSViewController
для сущностей пользователя и учетной записи . Когда пользователь входит в приложение, он может изменять информацию о пользователе или учетной записи, вызывая соответствующий контроллер представления. В фоновом режиме у меня есть приложение, которое периодически заполняет журналы пользователя в делегате приложения в отдельном потоке.
Я использую отдельный NSManagedObjectContext
для фонового потока и NSManagedObjectContext
делегата приложения. ] для ввода данных в контроллеры представления. Я хотел бы знать несколько вещей:
1) это хорошая практика? Должен ли я создавать NSManagedObjectContext
для каждого контроллера представления, а затем объединять контексты всякий раз, когда пользователь завершает внесение изменений?
2) Поскольку сущность журнала создается в фоновом потоке, у него есть собственный 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];
Is what I ' m делает в fetchUser
потокобезопасный? Нужно ли блокировать основной контекст управляемого объекта во время выборки пользователя, если одно из представлений изменяет одного и того же пользователя? Из этой статьи я понимаю (возможно, неправильно), что мне, возможно, придется это сделать. Пока у меня не было никаких проблем, но я не хочу оставлять потенциальный крайний случай.
3) Когда один из контроллеров представления вносит изменения в NSManagedObjectContext
делегата приложения, он отправляет сообщение уведомление, которое обрабатывается следующим образом:
- (void)contextDidSave:(NSNotification *)notification {
SEL selector = @selector(mergeChangesFromContextDidSaveNotification:);
[self.logManagedObectContext performSelector:selector onThread:backgroundThread withObject:notification waitUntilDone:NO];
}
Это то, как я должен обрабатывать слияние, или я должен вместо этого объединять NSManagedObjectContext
делегата приложения? Я обнаружил, что это (в основном потоке) заблокировало пользовательский интерфейс.
Мы будем благодарны за любую помощь.