2010-12-15 4 views
16

Ich verwende KVC/KVO, um eine benutzerdefinierte Bindungsimplementierung für ein Universitätsprojekt zu erstellen (es muss benutzerdefiniert sein, da ich Dinge ausführen möchte, die über Bindings hinausgehen iOS).Empfangen von 2 KVO-Benachrichtigungen für eine einzelne KVC-Änderung

Ich habe eine 'Bindings Controller', die für KVO-Benachrichtigungen auf einer Reihe von Schlüsseln auf einem Objekt registriert (mit addObserver: forKeyPath: Optionen: Kontext :) und ich bekomme Benachrichtigungen. Ich erhalte jedoch zwei Benachrichtigungen für jede Änderung. Ich habe eine Idee für eine Workaround, aber ich würde lieber trainieren warum dies geschieht und korrigieren Sie es!

Hat jemand irgendwelche Ideen, warum dies passieren könnte? Ich bin mir sicher, dass ich jede Benachrichtigung nur einmal registriert habe, und die einmalige Abmeldung bewirkt, dass beide Benachrichtigungen beendet werden.

Danke.

Edit:.

Ich habe eine Anfrage für einige Codes, also werde ich einige in setze Es ist ein wenig rau im Moment, es ist im Wesentlichen immer noch ein Proof of Concept, mit mir so tragen.

Dies ist eine der Eigenschaften ich beobachtet bin (ich weiß, es ist ein bisschen seltsam, aber diese Klasse stellt im Wesentlichen bestimmte Eigenschaften eines NSManagedObject als Eigenschaften von mir selbst):

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

Dies ist der Code, den ich verwende diese Eigenschaft zu beobachten (bestätigt nur einmal ausführen, und nur an einem einzigen Ort):

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

Alle Anrufe nach dem, was dieser Eigenschaft ändern, zB:

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

wird das Verfahren verursachen:

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

zweimal aufgerufen werden, mit den gleichen Argumenten jedes Mal.

+0

Post (relevanten) Code. –

Antwort

21

Sie dies zu tun:

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

aber (von den Klängen davon) aus einer nicht NSManagedObject Unterklasse. Dies bedeutet, dass Cocoa versucht, KVO-Benachrichtigungen automatisch für Sie zu senden. Sie ergänzen das, indem Sie auch Ihre eigenen schicken. Lösungen:

  • Aufschalten +automaticallyNotifiesObserversForKey:NO
  • Ändern Sie Ihre Methode, um zurückzukehren:

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

+0

Awesome, das scheint es behoben zu haben.Ich war mir nicht bewusst, dass Cocoa diese Ereignisse automatisch gesendet hat, wenn Sie die Accessoren selbst implementiert haben. Vielen Dank! – extremeboredom

1

Vielleicht setzen Sie eine NSLog in Ihrem addObserver Anruf, um zu sehen, ob Sie zwei Beobachter hinzufügen.

+0

Ich habe dies überprüft, der Aufruf von addObserver existiert nur in einer Methode, und ich habe bestätigt, dass die Methode nur einmal ausgeführt wird. – extremeboredom