Отразите изменения в объектах в родительском объекте с помощью NSFetchedResultsController - PullRequest
13 голосов
/ 25 октября 2010

У меня есть два объекта события и время.Объект события имеет отношение 1 ко многим объектам времени, поскольку каждое событие может выполняться несколько раз.Теперь я хочу отобразить все события в хронологическом порядке в табличном представлении.Поэтому я настроил fetchedResultsController для выборки всех временных объектов, сортировки их по времени начала и отображения информации о событии, используя связь с объектом события.Все идет нормально.Но теперь, если пользователь вкладывает запись в таблицу, я передаю объект события в detailViewController, где событие можно редактировать.

Проблема в том, что теперь только объект события помечается как обновленный.Я узнал об этом, просмотрев каталог userInfo уведомления NSManagedObjectDidChange.В результате методы делегата в FRC не запускаются, поскольку объекты времени не были изменены.

Как вручную пометить объект времени как измененный, чтобы заставить FRC распознавать изменения и обновлять ячейки соответствующим образом?Я пытался запустить методы КВО willChangeValueForKey и didChangeValueForKey, но пока это не сработало.

Большое спасибо Томас

Ответы [ 3 ]

7 голосов
/ 15 августа 2011

Моя модель немного отличается, но ее легко можно перевести на вашу.
Я получил древовидную структуру:

  • Элемент
    • название
    • parent (to-one)
  • Папка: Элемент
    • children (to-many)
  • Файл: Элемент

Когда файл добавляется или удаляется, только первая папка в очереди получает уведомление об этом изменении.При изменении заголовка файла ни одна папка не будет уведомлена.Итак, что делать?
Я попытался переопределить -willChangeValueForKey: и -didChangeValueForKey: в моем классе Element.

- (void)willChangeValueForKey:(NSString *)key
{
    [super willChangeValueForKey:key];
    [self.parent willChangeValueForKey:@"children"];
}

- (void)didChangeValueForKey:(NSString *)key
{
    [super didChangeValueForKey:key];
    [self.parent didChangeValueForKey:@"children"];
}

По сути, это заставляет родительскую папку обновляться, потому что один из ее дочерних элементовизменилось.
Надеюсь, это сработает и у вас.

5 голосов
/ 21 апреля 2014

Ответ выше от @Jenox представляется правильной идеей, но лучше не переопределять эти методы, поскольку они вызываются всякий раз, когда любой ключ изменяется на дочернем объекте и, вероятно, влияет на производительность и вызвать неожиданные побочные эффекты (это сделал для меня). Вероятно, лучше всего вызывать их в любом методе, в котором вы вносите изменения в дочерний объект, например:

- (void)updateFromDictionary:(NSDictionary *)aDictionary {
    [myParentModel willChangeValueForKey:@"myChildObject"];
    [super updateFromDictionary:aDictionary];
    [myParentModel didChangeValueForKey:@"myChildObject"];
}

Обратите внимание, что updateFromDictionary - это один из моих методов, а не системный метод.

4 голосов
/ 01 апреля 2011

Сейчас я работаю над некоторыми подобными обновлениями. Вот как я подошел к проблеме.

Допустим, у нас есть объект A, который относится к объекту B. B имеет свойство C. Мы хотим, чтобы изменения свойства C отражались в FRC, которые используют A в качестве извлеченного объекта. Чтобы это произошло, я определил метод доступа к свойству C из объекта A:

//A.m
- (void)setC:(int)cValue {
  [self willChangeValueForKey:@"b"];
  self.b.c = cValue
  [self didChangeValueForKey:@"b"];
}

- (int)c {
  return self.b.c;
}

Это позволило моим ячейкам обновляться на основе обратных вызовов FRC с типом NSFetchedResultsChangeUpdate. Надеюсь, это поможет решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...