2014-12-16 2 views
0

Как узнать, какие предметы мой объект наблюдает за ключевыми значениями?Просмотр Замечания о ключевом значении

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

for (AVPlayerItem *item in itemsToRemove) { 
    @try{ 
     [item removeObserver:self forKeyPath:@"status" context:(__bridge void *)(foo)]; 
    }@catch(id anException){ 
     //wasn't observing 
    } 
} 

EDIT: Я рассматриваю, используя свой собственный словарь, чтобы отслеживать наблюдения, но это кажется излишним поскольку KVO словарь существует где-то. К сожалению, нет доступа к API.

+0

Здесь http://stackoverflow.com/questions/27482173/how-to-check-key-value-observing-in-objectivec-for-dictionary-of-arrays/27482567# 27482567 вы можете увидеть пример и два метода наблюдения огня. –

+1

@OnikIV OP не спрашивал, как наблюдать. Он спрашивал, как узнать, наблюдает ли он. – Rob

+0

Да @Rob, если он прочитал весь ответ, опубликованный, он хорошо видит, чем когда вы наблюдаете какое-либо свойство этот метод: "- (void) observValueForKeyPath: (NSString *) keyPath ofObject: (id) изменение объекта: (NSDictionary *) change context: (void *) context { // Здесь ваши действия зависят от пути ключа ... } ". Другими словами, если вы не заметили какой-либо ключевой путь, этот метод не будет вызываться. –

ответ

0

Там нет никакого способа узнать, что до тех пор, пока добавить логический флаг в контроллер и использовать его, чтобы пометить и проверить, если ваш зарегистрированный для КВО. Как правило, вы должны балансировать регистрацию и отмену регистрации из наблюдения KVO.

Использование исключения в ARC является плохим и может привести к утечке памяти до тех пор, пока вы не используете -fobjc-arc-exceptions.

Краткая история: Исключения стоят дорого, поэтому ARC неправильно обрабатывает их, пока вы явно не спросите. Существует пояснение к этому: https://stackoverflow.com/a/4649234/351305

3

Кажется, что нет другого выбора, кроме как поймать исключение, даже NSHipster recommends to do so. Однако, по крайней мере, в моем случае, почти ничего не требовалось для проверки. В конце концов, вы контролируете наблюдателей.

Вы можете использовать обертку (например, FBKVOController), которая добавляет больше здравого смысла к необработанному KVO (и делает наблюдение намного проще, позволяя использовать блоки). Среди других особенностей, он не откажет при попытке удалить несуществующую наблюдателя:

@discussion If not observing object key path, or unobserving nil, this method results in no operation. 
*/ 
- (void)unobserve:(id)object keyPath:(NSString *)keyPath; 
+0

Я люблю NSHipster, но я думаю, что их предложение вводит в заблуждение и устарело с сегодняшнего дня.Исключения используются как аварийный выход в Objective-C, раньше это было не так! Поэтому ваше предложение использовать KVOController намного лучше, чем try-catch. – Andy

+1

Я думаю, что на момент написания статьи NSHipster знал, что исключений вообще следует избегать. Но в этом случае перехват исключения является обходным решением для плохо разработанного API KVO. –

Смежные вопросы