2010-12-15 11 views
16

Sto utilizzando KVC/KVO per creare un'implementazione personalizzata dei binding per un progetto University (è necessario essere personalizzati in quanto voglio fare cose oltre a ciò che possono fare i bindings, inclusa la corsa su iOS).Ricezione di 2 notifiche KVO per una singola modifica KVC

Ho un "controller dei collegamenti" che registra le notifiche KVO su un numero di chiavi su un oggetto (utilizzando addObserver: forKeyPath: options: context :) e ricevo notifiche. Tuttavia, ricevo due notifiche per ogni modifica. Ho un'idea per una soluzione alternativa, ma preferirei risolvere perché questo sta accadendo e correggerlo!

Qualcuno ha qualche idea del perché questo potrebbe accadere? Sono certo di aver registrato ciascuna notifica una sola volta e di annullare la registrazione una sola volta fa sì che entrambe le notifiche si interrompano.

Grazie.

Edit:.

ho una richiesta di un codice, quindi mi metterò un po 'in' un po 'ruvido, al momento, è in sostanza ancora una prova di concetto, in modo da portare con me.

Questa è una delle proprietà che sto osservando (lo so che è un po 'strano, ma questa classe espone essenzialmente determinate proprietà di un NSManagedObject come proprietà di se stesso):

- (void)setName:(NSString *)name 
{ 
    [self willChangeValueForKey:@"name"]; 
    [contact setFirstName:name]; 
    [self didChangeValueForKey:@"name"]; 
} 

Questo è il codice che uso osservare che la proprietà (confermata per essere eseguito solo una volta, e solo in un unico luogo):

[viewModel addObserver:self 
      forKeyPath:@"name" 
       options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial) 
       context:viewController]; 

Eventuali chiamate dopo ciò che cambiano tale proprietà, ad esempio:

viewModel.name = @"Joe"; 
[viewModel setName: @"Joe"]; 
[viewModel setValue: @"Joe" forKey: @"name"]; 

farà sì che il metodo:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 

essere chiamati due volte, con gli stessi argomenti ogni volta.

+0

Inserisci il codice (rilevante). –

risposta

21

Lo stai facendo:

- (void)setName:(NSString *)name 
{ 
    [self willChangeValueForKey:@"name"]; 
    [contact setFirstName:name]; 
    [self didChangeValueForKey:@"name"]; 
} 

Ma (dai suoni di esso) da un non NSManagedObject sottoclasse. Ciò significa che Cocoa tenterà di inviare automaticamente notifiche KVO per te. Lo stai completando inviando anche il tuo. Soluzioni:

  • Override +automaticallyNotifiesObserversForKey: per tornare NO
  • cambiare il metodo di:

    - (void)setName:(NSString *)name { [contact setFirstName:name]; }

+0

Fantastico, sembra averlo risolto.Non ero a conoscenza del fatto che Cocoa inviasse automaticamente quegli eventi se implementavi tu stesso gli accessori. Grazie! – extremeboredom

1

Forse mettere un NSLog nella tua chiamata addObserver, per vedere se stai aggiungendo due osservatori.

+0

Ho verificato questo, la chiamata addObserver esiste solo in un metodo e ho confermato che il metodo viene eseguito solo una volta. – extremeboredom

Problemi correlati