KVO и базовые данные, получение только измененных значений посредством наблюдения - PullRequest
6 голосов
/ 05 июля 2011

Итак, я довольно новичок в Core Data и KVO, но у меня есть подкласс NSManagedObject, который успешно наблюдает за своим собственным отношением ко многим.Проблема заключается в том, что при наблюдаемых изменениях я хочу перебирать только набор объектов, которые были добавлены или удалены.Есть ли какой-нибудь способ получить прямой доступ к этим предметам?Или я должен сделать что-то относительно неэффективное, например:

NSSet* newSet = (NSSet*)[change objectForKey:NSKeyValueChangeNewKey];
NSSet* oldSet = (NSSet*)[change objectForKey:NSKeyValueChangeOldKey];

NSMutableSet* changedValues = [[NSMutableSet alloc] initWithSet:newSet];
[changedValues minusSet:oldSet];

Мне кажется, вы должны этого избежать, потому что в этих сообщениях ...

[self willChangeValueForKey:forSetMutation:usingObjects:];
[self  didChangeValueForKey:forSetMutation:usingObjects:];

вы передаете этодобавленные / удаленные объекты!Возможно, было бы полезно знать, что происходит с этими объектами?

Ответы [ 2 ]

5 голосов
/ 07 ноября 2011

Вы действительно изучили содержание "старых" и "новых" значений, предоставленных наблюдением KV? Когда я наблюдаю изменение в изменяемом наборе, инициируемом didChangeValueForKey:forSetMutation:usingObjects:, значение словаря изменений для NSKeyValueChangeNewKey содержит только все добавленные объекты, в то время как значение NSKeyValueChangeOldKey содержит только любые удаленные объекты, поэтому вам не нужно вручную определять, что имеет изменилось. Однако наблюдение, инициированное didChangeValue:forKey: , даст всю старую коллекцию для NSKeyValueChangeOldKey и всю новую коллекцию для NSKeyValueChangeNewKey, даже если они имеют идентичное содержимое.

2 голосов
/ 05 июля 2011

Когда вы регистрируетесь для наблюдения за объектом, включите параметр NSKeyValueObservingOptionNew NSKeyValueObservingOptionOld , если хотите).

...