В соответствии с собственными рекомендациями Apple, при настройке KVC / KVO-совместимых аксессоров вручную, нужно включать ОБЕ методы KVO willChange
] и didChange
. Это то, что я делал во всех моих ручных методах доступа.
Однако для каждой половины методов KVC (будет и сделано) с точно одинаковым содержимым словаря вызывается
Object: change: context
.
При регистрации наблюдателя с использованием опции: NSKeyValueObservingOptionPrior
наблюдатель по-прежнему вызывается дважды - один раз для каждой половины - и, опять же, с идентичным содержимым словаря, сохраняет только Разница в том, что ключ «notificationIsPrior» включен в словарь.
Теперь, когда KVO используется для изменения атрибутов «ресурсоемкость процессора» - таких как изменение цвета или перерисовка большого и сложного дизайна, имеет смысл действовать только на «didChange» и игнорировать (или, по крайней мере, отделить) "willChange". Раньше я достигал этого путем преобразования ключевой строки в элемент списка перечисления, который возвращает сдвинутую влево «1» и использовал эту цифру для установки флага в 32- или 64-битном целом числе при получении первого вызова и когда флаг сбрасывается во второй раз, я выполняю операции, требующие интенсивного использования ЦП.
Однако мне кажется, что это нетривиальные накладные расходы, которые нужно реализовать для каждого случая. Есть ли у кого-нибудь другой «предпочтительный» способ различать обратный вызов для «willChange» и «didChange», не позволяя выполнять одну и ту же обработку дважды?
Я тщательно изучил документацию Apple и эту справочную группу в поисках альтернативных вариантов, но собственная документация Apple на самом деле не содержит подробностей по этому вопросу, и несколько человек в этой группе также боролись с аналогичной проблемой.Ни в том, ни в другом случае не было предложено окончательного решения. Если кто-нибудь знает лучший способ - кроме уклонения от 'willChange' с использованием чередующихся флагов - я был бы очень благодарен. (Почему Apple не могла просто включить ключ «фазы» в словарь изменений ???)