Когда стоит заморачиваться с KVC и KVO? Всегда?

Это похоже на почти новый надмножество по сравнению с Objective-C, с комбинациями точечной нотации, смешанной с директивами, например: [email protected](...), и синтаксисом соответствия, например: -replaceObjectIn<Key>AtIndex:withObject:. Кажется, что большая часть KVC похожа на простые методы доступа, которые можно синтезировать в любом случае. Тем не менее, я скажу, что KVObserving делает приложения MVC проще. Мнения?


person user2000809    schedule 04.05.2013    source источник


Ответы (1)


Кодирование ключ-значение позволяет вам искать произвольно вложенные атрибуты, идентичность которых известна только во время выполнения. Например, KVC не является хорошей заменой person.name — он излишне универсален для такой специфической задачи. Но допустим, мы не знали, когда писали нашу программу, хотим ли мы найти имя, возраст или любимую марку обуви. Мы довольно часто сталкиваемся с подобными вещами с источниками данных NSTableView. Мы могли бы написать большое повторяющееся условное выражение, чтобы отправить нужное нам сообщение, но KVC упрощает эту задачу:

return [personController.selectedPerson valueForKeyPath:desiredAttribute];

Затем мы можем установить desiredAttribute в @"name", @"age" или @"favoriteShoeBrand.name", и мы получим правильное значение без ветвления, даже если мы знаем только атрибут, который нам нужен во время выполнения.

Это также полезно, потому что классы могут особым образом обрабатывать KVC. Например, NSArray делает что-то действительно хорошее. [arrayOfPeople valueForKeyPath:@"name"] не эквивалентен arrayOfPeople.name — вместо этого он передает ключевой путь к каждому объекту и создает новый массив с результатами этого. Таким образом, она служит той же цели, что и функция карты во многих других языках. Существуют также специальные операторы KVC, такие как @distinctUnionOfArrays (который берет коллекцию массивов и объединяет их вместе, игнорируя дубликаты), которые делают работу с вложенными коллекциями таким образом намного более кратким, чем это было бы в противном случае.

Что касается KVO, это просто способ получать уведомления, когда что-то меняется — так, например, вы можете обновить свой пользовательский интерфейс с новым возрастом в день рождения человека, при этом пользовательскому интерфейсу не нужно знать о логике дня рождения. Если это звучит полезно для вас, вам, вероятно, понравится.

person Chuck    schedule 04.05.2013