Key-Value-Observation - поиск более элегантного решения для реагирования на изменения стоимости - PullRequest
1 голос
/ 28 февраля 2012

Я столкнулся с неприятной особенностью KVO: все уведомления направляются одним способом (observeValueForKeyPath:....), требующим несколько операторов IF, если объект наблюдает многочисленные свойства.

Идеальным решением было бы передать метод в качестве аргумента методу, который в первую очередь устанавливает наблюдение, но кажется, что это невозможно. Существует ли решение этой проблемы? Сначала я подумал об использовании аргумента keyPath (addObserver:forKeyPath:options:context:) для вызова метода через NSSelectorFromString, но потом наткнулся на шаблон KVO Dispatcher с методом в качестве контекста и статью, с которой он связан. предлагает другое решение для передачи аргументов (хотя я еще не получил это работает).

Я знаю, что многие люди сталкивались с этой проблемой. Возник ли стандартный способ обращения с ним?

1 Ответ

1 голос
/ 18 июня 2013

ОП спрашивает:

Появился ли стандартный способ обработки?

Нет, не совсем.Есть много разных подходов.Вот некоторые из них:

Не могу сказать, что ни один из вариантов мне не подходитВидно, кажется достаточно распространенным, чтобы заработать титул "стандартным способом".Я подозреваю, что большинство людей, которые чувствуют мотивацию к решению этой проблемы, просто выбирают один и идут с ним, или пишут свои собственные - это не так, как если бы адаптация KVO для использования обратных вызовов на основе блоков - ракетостроение.Подход, основанный на методах, на который вы ссылаетесь, не кажется шагом вперед для простоты.Я понял, что вы пытаетесь исключить из уравнения неопределенность преобразования метода string-key-path <->, но этот тип падает, поскольку не все наблюдаемые keys / keyPaths являются методами.(Если ничего другого, вы можете наблюдать за произвольными ключами в NSMutableDictionaries и получать уведомления.)

Было бы неплохо, если бы Apple выпустила новый KVO API на основе блоков, но я не задерживаю дыхание.Но в то же время, как я уже сказал, просто выберите тот, который вам нравится, и используйте его или напишите свой собственный и используйте его.

...