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