2011-09-23 10 views
16

Załóżmy, że mam dwie jednostki, pracownika i dział. Dział ma wiele relacji z pracownikiem, wielu pracowników może być w każdym dziale, ale każdy pracownik należy tylko do jednego działu. Chcę wyświetlić wszystkich pracowników w widoku tabeli posortowanym według danych, które są własnością działu, do którego należą przy użyciu NSFetchedResultsController. Problem polega na tym, że chcę, aby mój stół aktualizował się, gdy obiekt działu otrzymuje zmiany, tak jak to się dzieje, gdy zmieniają się regularne właściwości pracownika, ale FetchedResultsController nie wydaje się śledzić powiązanych obiektów. Stałam przeszedł ten problem częściowo wykonując następujące czynności:NSFetchedResultsController z relacją nieaktualizującą się

for (Employee* employee in department.employees) { 
    [employee willChangeValueForKey:@"dept"]; 
} 

/* Make Changes to department object */ 

for (Employee* employee in department.employees) { 
    [employee didChangeValueForKey:@"dept"]; 
} 

To oczywiście nie jest idealne, ale to powoduje pracownikowi metodę opartą FRC delegat didChangeObject aby sprawdził. Prawdziwym problemem I opuściły teraz jest w sortowania FRC że jest śledzenie obiektów Pracownik:

NSEntityDescription *employee = [NSEntityDescription entityForName:@"Employee" inManagedObjectContext:self.managedObjectContext]; 
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"department.someProperty" ascending:NO]; 

Działa to doskonale i sortuje prawidłowo pracownikom po raz pierwszy, to się nazywa, problemem jest to, że podczas dokonywania zmian w departamenty someProperty, które powinny zmienić sortowanie mojej tabeli pracowników nic się nie dzieje. Czy istnieje jakiś dobry sposób, aby mój pracownik FRC śledził zmiany w związku? Szczególnie potrzebuję jakiegoś sposobu, aby zaktualizować sortowanie, gdy sortowanie jest oparte na powiązanej właściwości. Przejrzałem podobne pytanie, ale nie byłem w stanie znaleźć satysfakcjonującego rozwiązania.

Odpowiedz

16

Urządzenie NSFetchedResultsController jest przeznaczone tylko do oglądania jednego obiektu na raz. Twoja konfiguracja ma sens, nieco wykracza poza to, co obecnie może oglądać sam NSFetchedResultsController.

Moja rekomendacja to utworzenie własnego obserwatora. Możesz oprzeć go na ZSContextWatcher, który ustawiłem na GitHub, lub możesz uczynić go jeszcze prostszym.

Zasadniczo chcesz obejrzeć ogłoszenia NSManagedObjectContextDidSaveNotification, a następnie załadować ponownie swój stół, gdy zostanie uruchomiony jeden z twoich oddziałów.

Chciałbym również polecić firmie Apple zgłoszenie rdar z prośbą o poprawienie wersji NSFetchedResultsController.

+0

Nie jesteś pewien, czy chcesz skonfigurować FRC do oglądania więcej niż jednego obiektu naraz. Permutacje stałyby się duże i brzydkie w pośpiechu. Możesz również mieć problemy z okrągłością. – TechZen

+0

Przeszedłem przez sytuacje, w których widoki na iPada muszą oglądać więcej niż jeden podmiot, aby utrzymać stan. Właśnie tam pomysł powstał pierwotnie. –

+0

Byłbym za wtórnym lub podklasy. Im więcej złożoności dodasz do klasy bazowej, tym więcej będziesz musiał zarządzać i debugować. – TechZen