Я вызываю методы KVO вручную по причинам, выходящим за рамки этой проблемы. Я отключил автоматическое наблюдение за этим свойством. Я знаю, что я там делаю.
Я не понимаю, что вы подразумеваете под реализацией методов доступа к массивам в представлении. Привязки строятся поверх КВО. Все привязки реализуются с использованием observeValueForKeyPath:
Мое настраиваемое представление обеспечивает привязку, которую приложение привязывает к массиву - или, в данном случае, к контроллеру массива. Методы доступа применяются к KVC, а не к KVO.
Абсолютно важно, что я получаю сообщение об установке при каждом обновлении массива. Я бы не стал публиковать это как вопрос, если бы это не имело значения. Я называю что-то вроде
[[modelObject mutableArrayValueForKey:@"contents"] addObjectsFromArray:hundredsOfObjects];
При каждой вставке мое представление просматривает целый новый массив. Поскольку я потенциально добавляю сотни объектов, это O(N^2)
, когда оно должно быть O(N)
. Это совершенно неприемлемо, кроме проблем с производительностью. Но, поскольку вы упомянули об этом, представление должно выполнить значительный объем работы, чтобы наблюдать целый новый массив, что значительно замедляет работу программы.
Я не могу отказаться от использования контроллера массива, потому что мне нужна фильтрация и сортировка, а также потому, что NSTableView
привязан к тому же контроллеру. Я полагаюсь на это, чтобы синхронизировать сортировку и выборку.
Я решил свою проблему полным взломом. Я написал отдельный метод, который вызывает методы KVO вручную, так что отправляется только одно сообщение KVO. Это хак, мне это не нравится, и это все еще заставляет мой взгляд перечитать весь массив - хотя только один раз, сейчас - но пока работает, пока я не найду лучшее решение.