Свойства объекта KVO в отношениях «ко-многим» - PullRequest
4 голосов
/ 01 декабря 2011

У меня есть отношение Базовые данные ко многим, состоящее из Parent <--- >> Child. Я хотел бы настроить механизм наблюдения значения ключа так, чтобы при изменении свойства (например, firstName, lastName) любого из дочерних объектов оно вызывало уведомление. При использовании стандартного синтаксиса KVO:

[self.parentObject addObserver:self forKeyPath:@"children" options:NSKeyValueObservingOptionNew context:NULL]

это только уведомляет, когда изменяется само отношение (т. Е. Дочерний объект добавляется или удаляется из отношения), а не когда изменяется свойство одного из этих дочерних объектов. Очевидно, именно так оно и было разработано для работы, поэтому в этом нет ничего плохого, но как я могу вместо этого использовать KVO для достижения желаемого требования?

Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 01 декабря 2011

AFAIK - нет встроенного способа наблюдать свойства объекта коллекции с помощью одной строки кода.Вместо этого вы должны добавить / удалить наблюдателей, когда объект вставлен / удален из вашей коллекции.

Объяснение и пример проекта можно найти здесь: https://web.archive.org/web/20120319115245/http://homepage.mac.com/mmalc/CocoaExamples/controllers.html (см. Раздел «Наблюдение за коллекцией - не то же самое, что наблюдение за свойствами объектов в коллекции»)

Обновление:
Ссылка разорвана - я изменил ее на снимок archive.org.

3 голосов
/ 05 октября 2013

Немного поздний ответ, но, возможно, он будет полезен для тех, кто гуглит это.

Вы можете установить NSFetchedResultsController для дочернего объекта с предикатом @"parent == %@", child, а затем добавить свой контроллер в качестве делегата к этому fetchedResultController. Делегат будет вызываться при изменении любого из свойств дочернего элемента, а также при их добавлении и т. Д. Пример кода приведен ниже. Я также добавил дескриптор сортировки для сортировки детей по их имени в

...
NSFetchRequest* fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Child"];
fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]];

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"parent = %@", parent];
self.fetchResultsController.fetchRequest.predicate = predicate;

self.fetchResultsController = [[NSFetchedResultsController alloc] 
     initWithFetchRequest:fetchRequest managedObjectContext:context 
     sectionNameKeyPath:nil cacheName:nil];

self.fetchResultsController.delegate = self;
...

Затем вы реализуете метод делегата

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
   atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
  newIndexPath:(NSIndexPath *)newIndexPath {

И любой другой метод делегата, необходимый для вашей реализации (в документации есть очень хороший фрагмент кода для этого

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