NSFetchedResultsController с отношениями, не обновляющимися
Скажем, у меня есть две организации, сотрудник и отдел. Отдел имеет много отношений с сотрудником, многие сотрудники могут находиться в каждом отделе, но каждый сотрудник принадлежит только одному отделу. Я хочу отобразить всех сотрудников в таблице, отсортированных по данным, которые являются свойством отдела, к которому они принадлежат, используя NSFetchedResultsController. Проблема в том, что я хочу, чтобы моя таблица обновлялась, когда объект отдела получает изменения так же, как и при регулярных свойствах сотрудника, но FetchedResultsController, похоже, не отслеживает связанные объекты. Я частично передал эту проблему, выполнив следующие действия:
for (Employee* employee in department.employees) {
[employee willChangeValueForKey:@"dept"];
}
/* Make Changes to department object */
for (Employee* employee in department.employees) {
[employee didChangeValueForKey:@"dept"];
}
Это, очевидно, не идеально, но это приводит к вызову метода делегата FRC-делегата didChangeObject. Реальная проблема, которую я сейчас оставил, заключается в сортировке FRC, которая отслеживает объекты-сотрудники:
NSEntityDescription *employee = [NSEntityDescription entityForName:@"Employee" inManagedObjectContext:self.managedObjectContext];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"department.someProperty" ascending:NO];
Это отлично работает и правильно сортирует сотрудников при первом вызове, проблема в том, что когда я вношу изменения в отделы someProperty, которые должны менять сортировку таблицы сотрудников, ничего не происходит. Есть ли какой-нибудь хороший способ, чтобы изменения моего сотрудника FRC отслеживали в отношениях? В частности, мне просто нужно каким-то образом обновить сортировку, когда сортировка основана на связанном с ней свойстве. Я просмотрел какой-то подобный вопрос, но не смог найти удовлетворительного решения.
Ответы
Ответ 1
NSFetchedResultsController
действительно предназначен только для просмотра одного объекта за раз. Ваша настройка, хотя и имеет смысл, немного отличается от того, что NSFetchedResultsController
в настоящее время может просматривать самостоятельно.
Моя рекомендация состояла бы в том, чтобы настроить своего наблюдателя. Вы можете установить его с ZSContextWatcher, который я установил на GitHub, или вы можете сделать его еще более простым.
В основном вы хотите следить за публикациями NSManagedObjectContextDidSaveNotification
, а затем перезагружать таблицу, когда один из них загорается, содержащий объект отдела.
Я также рекомендовал бы добавить rdar с Apple и попросить улучшить NSFetchedResultsController
.