Наблюдение за связанными объектами CoreData NSTreeController для вставки / удаления

Я создаю свое собственное привязываемое пользовательское древовидное представление. Для этого я хотел бы понаблюдать за NSTreeController на предмет обновлений отношений его элементов ко многим. NSTreeController привязан к контексту управляемого объекта CD. Каждый уровень глубины имеет свой собственный CD Entity со свойствами parent / children / isLeaf. Мне нужно поддерживать ту же иерархию в представлении (и порядке дочерних элементов). Если что-то вставлено, я начну наблюдать за его дочерним свойством. И, конечно, мне нужно знать путь индекса для вновь вставленного объекта.

Я хотел бы точно знать, что было вставлено / удалено, чтобы я мог начать наблюдать за вставками / удалениями его дочерних элементов. Насколько я понимаю, стандартный способ сделать это - изучить "изменить" NSDictionary внутри наблюдатьValue: forKey ..., но изменения имеют значение NULL.

Я знаю, что это долгая ошибка, но есть ли ХОРОШИЙ способ решения этой проблемы? Я видел, что в некоторых примерах представления сохраняют массивы, а затем, когда модель изменяется, вы сравниваете различия. Это более сложно для просмотра дерева. Также этот способ тратит впустую память и циклы процессора. У меня есть одно обходное решение, которое я тестирую. Это вроде как работает, поэтому пока не буду описывать.


person Community    schedule 27.08.2009    source источник
comment
Вы когда-нибудь придумывали для этого достойное решение? У меня такая же проблема.   -  person Cody Brimhall    schedule 09.07.2011


Ответы (1)


Как насчет создания подкласса NSTreeController и реализации его методов вставки / удаления. Что-то вроде этого например.

- (void)insertObject:(id)object atArrangedObjectIndexPath:(NSIndexPath *)indexPath {

      // ... code to update your object relationships .. 
      // ... Take care here if you update any variables in your model (eg a sortindex) that would trigger KVO in the NSTreeController.  In those case you need to make the updates without triggering KVO by using setPrimitiveValue:forKey or get an infinite loop

      [super insertObject:object atArrangedObjectIndexPath:indexPath];

}
person Ira Cooke    schedule 27.08.2009