2011-08-06 9 views
5

Powiedzmy, że mam pracownika "podmiotu" z departamentami relacji "wiele do wielu" do innego działu "Departamentu". Jeśli mam instancję obiektu Employee, a kolekcja działów jest obecnie wadą, jaki jest najbardziej wydajny sposób na uzyskanie liczby działów?Czy wywoływanie "count" w przypadku błędu relacji między wieloma związkami CoreData powoduje przeniesienie wszystkich obiektów z kolekcji do pamięci?

Dwie oczywiste opcje:

1) wywołanie [myEmployee.departments count];

2) Konstruowanie fetchRequest wrócić tylko obiekty Departament którego dopasowanie „pracownik” punkty stosunek do mojego obiektu pracownika, a następnie wywołanie countForFetchRequest:

Oprócz użycia pamięci, jedna z tych metod mogłaby być niezauważalnie szybsza od drugiej?

Odpowiedz

0

Relacje nie są pobierane, chyba że masz powiązanieKeyPathsForPrefetching.

Jednak moją najlepszą radą dla ciebie jest zawsze wdrażać twoje rozwiązanie w najprostszy sposób, a THEN zajmuje się później problemami z wydajnością. Ludzie mają złą sławę w przewidywaniu problemów z wydajnością.

Jednym z narzędzi, który jest bardzo łatwy w użyciu, jest Instruments, który jest zawarty w Xcode.

Możesz łatwo uruchomić test przy użyciu obu podejść, a właściwie porównać liczby, zamiast po prostu przyjąć opinię nieznajomego na SO.

0

Po pierwsze: Po wywołaniu relacji obiekt jest ładowany jako "błąd", więc wydajność jest tak dobra.

Po drugie: Jeśli używasz metody countForFetchRequest, wniosek będzie:

NSFetchRequest *f = Departament.fetchRequest; 

f.predicate = [NSPredicate predicateWithFormat:@"ANY employees = %@", employe.objectID]; 

tak CoreData musi sprawdzić każdy dział wyglądać pracowników. W praktyce jest wolniej.

  • W twoim przypadku użyłbym pierwszej opcji.
  • Sytuacja byłaby inna, gdyby predykat wymagał właściwości obiektów, więc pierwsza opcja potrzebuje całych obiektów bez błędu. W tym przypadku zalecam użycie countForFetchRequest, ale najlepszą opcją jest porównanie w konkretnym przypadku.
Powiązane problemy