Как получать уведомления от подкласса NSMutableArray - PullRequest
0 голосов
/ 15 марта 2012

У меня есть подкласс NSMutableArray, чтобы учесть источник данных. Это называется BaseObjectArray. Массив фактически содержит только список идентификаторов строк (как uint64_t), и при запросе objectAtIndex он запрашивает у делегата источника данных объект с этим идентификатором строки (для учета отложенных запросов к БД).

Внутренний список идентификаторов строк - это собственный класс (подкласс RowIDSet или OrderedRowIDSet, который является просто подклассом NSObject), который содержит только список уникальных идентификаторов строк.

Что мне нужно, так это каким-то образом прослушивать изменения BaseObjectArray (который фактически прослушивает изменения своего объекта RowIDSet, возможно, с помощью аналогичного метода).

Поскольку объекты могут быть добавлены / удалены из BaseObjectArray без использования стандартного addObject:, но вместо этого с addRowID: объект, которому принадлежит BaseObjectArray, вероятно, не получит стандартные уведомления KVO.

Возможные решения, которые я рассмотрел:

  1. BaseObjectArray имеет свойства owner и ownerKey, а BaseObjectArray вызывает триггеры [owner willChangeForKey: ownerKey]; всякий раз, когда что-то меняется.

  2. Используйте will / didChangeNotificationBlocks - слушатели могут просто добавить блок в BaseObjectArray (сохраняя эти блоки в NSMutableArray), и все блоки в этом массиве срабатывают при изменении чего-либо в BaseObjectArray. Я не уверен относительно возможного кошмара цикла сохранения, который может последовать.

  3. KVO для свойства 'contents' объекта BaseObjectArray. Любой, кто хочет наблюдать BaseObjectArray, на самом деле наблюдает keyPath «содержимое», а внутри BOArray он вызывает [self willChangeForKeyPath: @ «contents»]. Свойство содержимого просто возвращает себя.

  4. ... что-то очевидное, что я пропустил ...

Пожалуйста, дайте мне знать, если какой-либо из них имеет наиболее (или какой-либо) смысл, или есть ли лучшее решение там.

Спасибо:)

Ответы [ 2 ]

3 голосов
/ 16 марта 2012

Если вы не знаете, что делаете, вы должны не подкласс NSMutableArray.NSMutableArray является кластером классов и требует специальной обработки .

Почему бы просто не создать собственный объект, который использует простой NSMutableArray в качестве класса хранения?Кажется, нет веской причины для подкласса NSMutableArray в вашем случае, но, возможно, я неправильно понимаю ваш вопрос.

0 голосов
/ 15 марта 2012

Я не знаю, сработает ли это, но если это сработает, вероятно, это лучший способ.

Убедитесь, что ваш подкласс NSMutableArray соответствует KVC для ключа self (если это не такработать для self добавить новое свойство, например rows, которое возвращает себя или копию себя).Для того чтобы сделать себя (или любое новое свойство, которое вы используете) KVC-совместимым, вы должны следовать правилам Индексированное соответствие многим для изменяемых упорядоченных коллекций:

  • Реализовать метод с именем -который возвращает массив.
  • Или имеет переменную экземпляра массива с именем или _.
  • Или реализует метод -countOf и один или оба из -objectInAtIndex: или -AtIndexes:.
  • При желании вы также можете реализовать -get: range: для повышения производительности.

self ставит флажок в первом из них.Также:

  • Реализация одного или обоих методов -insertObject: inAtIndex: или -insert: atIndexes:.
  • Реализация одного или обоих методов -removeObjectFromAtIndex: или -removeAtIndexes:.
  • условно, вы также можете реализовать -replaceObjectInAtIndex: withObject: или -replaceAtIndexes: with: для повышения производительности

Так что вам понадобится, например, -insertObject:inSelfAtIndex: и -removeObjectFrom<Key>AtIndex:

Затем вы можете использовать ручные уведомления KVO везде, где вы хотите уведомить наблюдателей о свойстве self этого объекта.Таким образом, вы можете использовать

NSIndexSet* indexes = // index set containing the index or indexes of objects to remove
[self willChange: NSKeyValueChangeRemoval valuesAtIndexes: indexes forKey:@"self"];

при удалении объектов.

...