Помощь в проектировании многопоточного приложения Core Data

alt text

Выше упрощено то, как выглядит моя модель. В моем приложении есть объект 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 делегата приложения? Я обнаружил, что это (в основном потоке) заблокировало пользовательский интерфейс.

Мы будем благодарны за любую помощь.

7
задан David 18 December 2010 в 00:22
поделиться