Различие KVO между willChangeValueForKey и didChangeValueForKey - необходимы ли оба?

В соответствии с собственными рекомендациями Apple, при настройке KVC / KVO-совместимых аксессоров вручную, нужно включать ОБЕ методы KVO willChange ] и didChange . Это то, что я делал во всех моих ручных методах доступа.

Однако для каждой половины методов KVC (будет и сделано) с точно одинаковым содержимым словаря вызывается Object: change: context .

При регистрации наблюдателя с использованием опции: NSKeyValueObservingOptionPrior наблюдатель по-прежнему вызывается дважды - один раз для каждой половины - и, опять же, с идентичным содержимым словаря, сохраняет только Разница в том, что ключ «notificationIsPrior» включен в словарь.

Теперь, когда KVO используется для изменения атрибутов «ресурсоемкость процессора» - таких как изменение цвета или перерисовка большого и сложного дизайна, имеет смысл действовать только на «didChange» и игнорировать (или, по крайней мере, отделить) "willChange". Раньше я достигал этого путем преобразования ключевой строки в элемент списка перечисления, который возвращает сдвинутую влево «1» и использовал эту цифру для установки флага в 32- или 64-битном целом числе при получении первого вызова и когда флаг сбрасывается во второй раз, я выполняю операции, требующие интенсивного использования ЦП.

Однако мне кажется, что это нетривиальные накладные расходы, которые нужно реализовать для каждого случая. Есть ли у кого-нибудь другой «предпочтительный» способ различать обратный вызов для «willChange» и «didChange», не позволяя выполнять одну и ту же обработку дважды?

Я тщательно изучил документацию Apple и эту справочную группу в поисках альтернативных вариантов, но собственная документация Apple на самом деле не содержит подробностей по этому вопросу, и несколько человек в этой группе также боролись с аналогичной проблемой.Ни в том, ни в другом случае не было предложено окончательного решения. Если кто-нибудь знает лучший способ - кроме уклонения от 'willChange' с использованием чередующихся флагов - я был бы очень благодарен. (Почему Apple не могла просто включить ключ «фазы» в словарь изменений ???)

6
задан jrturton 6 December 2011 в 12:50
поделиться