2010-09-13 10 views
5

Mam relacji jeden do wielu w wykresie Core Data i staram się zrozumieć różnicę między wykorzystaniem metody CoreDataGeneratedAccessors i proste zadanie do zmiany relacji. Na przykład Core Data Programming Guide ma przykład działu i pracownika. W tym przykładzie oni użyć CoreDataGeneratedAccessors się zatrudnianiem i zwalnianiem pracowników:Core-Data CoreDataGeneratedAccessors vs. proste przypisanie

[aDepartment addEmployeesObject:newEmployee]; 
[aDepartment removeEmployeesObject:firedEmployee]; 

Nie zdefiniować relację odwrotną, ale powiedzieć „dział” jest odwrotna zależność do „pracowników”. Czy następni powinni osiągnąć to samo?

newEmployee.department = aDepartment 
firedEmployee.department = nil; 

Według sekcji Manipulating Relationships and Object Graph Integrity programowania Przewodnik danych Core, późniejsze przykłady powinny automatycznie naprawić wszystkie relacje w celu utrzymania spójności wykresu. Jeśli tak, to czy istnieje jakiś powód użycia CoreDataGeneratedAccessors, gdy istnieje odwrotna zależność? Czy użycie CoreDataGeneratedAccessors zachowuje spójność wykresu na relacjach odwrotnych?

Odpowiedz

2

one nie definiują odwrotną związek, ale powiedzieć „dział” jest odwrotną zależność do „pracowników”. Czy następujące po tym osiągnąć to samo?

Obie operacje mają taki sam wynik, bez względu na to, który koniec związku (z odwrotnością) modyfikujesz.

Jeśli tak, czy istnieje jakikolwiek powód użycia CoreDataGeneratedAccessors, gdy istnieje odwrotna zależność? Czy użycie CoreDataGeneratedAccessors zachowuje spójność wykresu na relacjach odwrotnych?

Spójność nie dotyczy obu metod. Ze względu na wydajność bardzo ważna jest modyfikacja dużych relacji za pomocą odpowiednich metod.

Rozwiązanie 1 (wypalanie wszystkich pracowników działu)

for (Employee* employee in aDepartment.employees) 
{ 
    employee.department = nil 
} 

Rozwiązanie 2

aDepartment.employees = nil; 

Pierwsze rozwiązanie spowodowałoby aktualizację w Tabeli-() widok po każdej operacji, podczas gdy druga spowoduje dokładnie jedną aktualizację wszystkich widoków. Może to być duża różnica w przypadku obsługi dużej liczby obiektów.

Jeśli potrzebujesz więcej szczegółowych informacji, myślę, że podobne tematy zostały już omówione na SO.

+0

Martin- dzięki za odpowiedź. Mam sytuację, w której mogę jednorazowo użyć [aDepartment addEmployeesObject: newEmployee], ale kolejne wywołania w aplikacji (bez względu na to, czy są prowadzone u innego nowego pracownika), nie są aktualizowane. Jednak zastąpienie tego przez newEmployee.department = aDepartment zawsze działa. Zachowania tych dwóch połączeń wydają się niekonsekwentne, więc jestem zdziwiony, że oni powinni robić to samo. Pomysły? – chris

+0

@chris - brzmi to tak, jakbyś nie miał odwrotnej relacji między jednostką działu a jednostką Employee. – TechZen

+0

Doświadczyłem takiego zachowania tylko w pewnych szczególnych sytuacjach, gdy obserwacje są uruchamiane podczas przetwarzania pewnych podstawowych danych i modyfikacji kodu obserwatora.(to był błąd mojego kodu) –