NSFetchedResultsController с отношениями не обновляется - PullRequest
18 голосов
/ 23 сентября 2011

Допустим, у меня есть две сущности, сотрудник и отдел.У отдела есть множество отношений с сотрудником, в каждом отделе может быть много сотрудников, но каждый сотрудник принадлежит только одному отделу.Я хочу отобразить всех сотрудников в табличном представлении, отсортированном по данным, которые являются свойством отдела, которому они принадлежат с помощью 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];

Это прекрасно работает и правильно сортирует сотрудников при первом вызове, проблема в том, что когда я делаю измененияс отделами какой-то собственности, которая должна изменить сортировку моей таблицы сотрудников, ничего не происходит.Есть ли хороший способ, чтобы мой сотрудник FRC отслеживал изменения в отношениях?В частности, мне просто нужен какой-то способ обновить сортировку, когда сортировка основана на связанном свойстве.Я просмотрел похожий вопрос, но не смог найти удовлетворительного решения.

Ответы [ 2 ]

18 голосов
/ 23 сентября 2011

NSFetchedResultsController действительно предназначен только для просмотра одного объекта за раз.Ваша настройка, хотя и имеет смысл, она немного выше того, что NSFetchedResultsController в настоящее время способен просматривать самостоятельно.

Я бы порекомендовал настроить ваш собственный наблюдатель.Вы можете основать его на ZSContextWatcher, который я настроил на GitHub , или вы можете сделать его еще более простым.один стреляет, в котором содержится ваша организация.

Я бы также рекомендовал подать в Apple rdar и попросить улучшить NSFetchedResultsController.

0 голосов
/ 17 марта 2019

Swift

Поскольку NSFetchedResultsController предназначен для одной сущности за раз, вы должны прослушивать NSManagedObjectContextObjectsDidChangeNotification, чтобы получать уведомления обо всех изменениях взаимосвязи сущностей.1006 * Вот пример:

//UITableViewController
//...
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    NotificationCenter.default.addObserver(self, selector: #selector(managedObjectsDidChangeHandler(notification:)), name: .NSManagedObjectContextObjectsDidChange, object: mainManagedContext)
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    NotificationCenter.default.removeObserver(self, name: .NSManagedObjectContextObjectsDidChange, object: mainManagedContext)
}

@objc fileprivate func managedObjectsDidChangeHandler(notification: NSNotification) {
    tableView.reloadData()
}
//...
...