Moje kakao/aplikacja ma kontekst zarządzanego obiektu w głównym wątku. Kiedy muszę aktualizować swoje dane mój program:Core Data łączy dwa obiekty zarządzane obiekty
- Zacznij nowy wątek
- Otrzymuj nowe dane z serwera
- Utwórz nowy zarządzanego obiektu Context
- Wyślij zgłoszenie do głównego wątku w celu połączenia się z dwóch kontekst
jest to funkcja, która odbierać powiadomienia w głównym wątku
- (void)loadManagedObjectFromNotification:(NSNotification *)saveNotification
{
if ([NSThread isMainThread]) {
[self.managedObjectContext mergeChangesFromContextDidSaveNotification:saveNotification];
} else {
[self performSelectorOnMainThread:@selector(loadManagedObjectFromNotification:) withObject:saveNotification waitUntilDone:YES];
}
}
Nie otrzymuję żadnego błędu. Moim problemem jest wynik scalenia, to faktycznie połączenie zarządzanych obiektów z obu kontekstów.
Mój podmiot to naprawdę prosta lista atrybutów i relacji.
Być może scalenie wymaga pewnych instrukcji, aby zrozumieć, kiedy zaktualizowany obiekt zarządzany NIE JEST nowy, ale jest edytowaną wersją pierwszego. Wyobrażam sobie, że gdzieś muszę określić sposób jednoznacznego identyfikowania jednostki (atrybut może na przykład działać jak identyfikator) i coś takiego jak polityka scalania (jeśli 2 zarządzany obiekt reprezentuje ten sam obiekt, należy go pobrać z lastModificationDate nowszy).
Po prostu muszę zrozumieć, jak prawidłowo scalić 2 konteksty, aby mieć jedną zaktualizowaną kopię dla każdego obiektu.
AKTUALIZACJA 1
Problem jest teraz dla mnie jasny. Kontekst 2 ma dużą różnicę: identyfikator obiektu. Podczas gdy kontekst głównego wątku pobrał obiekt ManagedObjects z koordynatorem magazynu trwałego, drugi wątek tworzy ten obiekt, pobierając zdalny adres URL. Nawet jeśli obiekty mają tę samą zawartość, będą miały 2 różne obiektyID.
Moje obiekty miały już unikalny identyfikator, mogłem użyć setObjectId w celu ustawienia tej wartości. (Dokumentacja Apple mówi, że to NIE jest dobry pomysł).
Jest oczywiste, że identyfikatory obiektów są różne, ponieważ tworzy się obiekty, a następnie pobiera je ze sklepu i aktualizuje. Właśnie dlatego powiedziałem w mojej odpowiedzi, że nie potrzeba niczego więcej, aby scalić obiekty. W każdym razie właściwym sposobem radzenia sobie z tą sytuacją jest użycie identyfikatorów zarządzanych obiektów. Ponieważ identyfikatory obiektów zarządzanych są bezpieczne dla wątków, można je przekazać z głównego wątku do innego wątku, a następnie użyć obiektu existingObjectWithID: error: do pobrania obiektu powiązanego z określonym identyfikatorem, zaktualizowania go i zapisania kontekstu. Teraz połączenie będzie działać zgodnie z oczekiwaniami. –
Alternatywnie, jeśli nie wiesz z góry, jakie zarządzane identyfikatory obiektów muszą być przekazywane między wątkami, to w drugim wątku po prostu pobierasz obiekty za pomocą predykatu, aby pobrać te odpowiadające obiektom pobranym z serwera, a następnie aktualizujesz je i zapisz kontekst. –
Prawidłowo! Problem stanowiły obiekty id. Teraz za każdym razem, gdy wykonuję pobieranie i muszę zaktualizować istniejący obiekt, pobieram obiekt ze sklepu i aktualizuję go. – Giuseppe