Наблюдение связанных сущностей CoreData NSTreeController для вставки / удаления - PullRequest
2 голосов
/ 27 августа 2009

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

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

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

1 Ответ

1 голос
/ 27 августа 2009

Как насчет создания подклассов 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];

}
...