Pomoc z podstawowej aplikacji wielowątkowych danych projektowych
Powyżej jest uproszczeniem tego, co mój model wygląda. Moja aplikacja ma obiekt NSWindowController
sterujący dwoma obiektami NSViewController
dla podmiotów użytkownika. Gdy użytkownik loguje się do aplikacji, może modyfikować informacje o użytkowniku lub koncie, przywołując odpowiedni kontroler widoku. W tle mam aplikację okresowo zapełniającą logi użytkownika w delegacie aplikacji w osobnym wątku.
Używam oddzielnego NSManagedObjectContext
dla wątku tła i pliku NSManagedObjectContext
delegata aplikacji do wprowadzania danych w kontrolerach widoku. Chciałbym wiedzieć kilka rzeczy:
1) Czy to jest dobra praktyka? Czy należy utworzyć NSManagedObjectContext
dla każdego kontrolera widoku, a następnie scalić konteksty, gdy użytkownik wprowadzi zmiany?
2) Ponieważ jednostka log jest tworzona w wątku tła, ma swoją własną NSManagedObjectContext
. Jednak każdy dziennik zawiera informacje z jednostek kont użytkownik i , które są utworzone w aplikacji NSManagedObjectContext
delegata aplikacji. To jak ja ściągam użytkownika:
- (NSManagedObjectID*) fetchUser:(NSString*) userID {
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"user":inManagedObjectContext:self.managedObjectContext];
/** snip **/
}
Metoda ta jest wywoływana przez wątek tła w następujący sposób:
NSManagedObjectID* userObjectID = [self fetchUser:userID];
NSManagedObject* userObject = [self.logsManagedObjectContext objectWithID:userObjectID];
Czy to, co robię w fetchUser
wątku bezpieczny? Czy muszę zablokować główny kontekst obiektu zarządzanego podczas pobierania użytkownika w przypadku, gdy jeden z widoków modyfikuje tego samego użytkownika? Od this article Rozumiem (być może niepoprawnie), że być może będę musiał to zrobić. Do tej pory nie napotkaliśmy żadnych problemów, ale nie chcę opuścić potencjalnego przypadku skrajnego.
3) Gdy jeden z kontrolerów widoku wprowadza zmiany do delegata aplikacji na NSManagedObjectContext
to księguje powiadomienie, że jest obsługiwany w sposób następujący:
- (void)contextDidSave:(NSNotification *)notification {
SEL selector = @selector(mergeChangesFromContextDidSaveNotification:);
[self.logManagedObectContext performSelector:selector onThread:backgroundThread withObject:notification waitUntilDone:NO];
}
Czy to w jaki sposób należy obsługiwać scalania lub powinien być scalenie zamiast tego delegata aplikacji NSManagedObjectContext
? Odkryłem, że robienie tego (w głównym wątku) blokowało interfejs użytkownika.
Każda pomoc zostanie doceniona.
Nie wiedziałem, że mogę po prostu odzyskać użytkownika z tła MOC. Wszystko, co muszę zrobić, to dać im ten sam ** NSPersistentStoreCoordinator **? Jeśli to zrobię, muszę pobrać przy użyciu identyfikatora obiektu lub czy mogę uzyskać obiekt bezpośrednio? – David
Możesz pobrać obiekty bezpośrednio. Wystarczy napisać kod, aby scalić zmiany po otrzymaniu powiadomienia od innych MOC dzielących tego samego koordynatora. – paulbailey