[FIXED] Entfernen eines Beobachters

Ausgabe

In einer NSManagedObject Sub Class habe ich den Code …

- (void) awakeFromInsert { 
[self addObserver:[NSApp delegate] forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil]; 
}

Was meinen App-Delegaten als Beobachter hinzufügt, was ich jetzt tun möchte, ist aus meinem App-Delegaten heraus, ich möchte mich selbst als Beobachter für meine NSManagedObject-Unterklasse entfernen.

Wie würde ich das tun? Vielen Dank.

Ich dachte daran, dies zu meinem App Delegate hinzuzufügen

[JGManagedObject removeObserver:self forKeyPath:@"name"];

ist aber leider removeObserver:forKeyPath:keine Klassenmethode.

Lösung

Für so etwas ist es wahrscheinlich am besten, das Design zu überdenken. In diesem Fall müsste der Delegierte bestimmte Kenntnisse über das verwaltete Objekt selbst haben, um dies zu tun – und der Delegierte müsste eine Vorstellung davon haben, wann im Lebenszyklus es mit der Beobachtung aufhören sollte (oder wollte). das Objekt.

Sie haben einige Möglichkeiten. Anstatt dies im Wachzustand von der Einfügung zu tun, könnten Sie den Delegaten veranlassen, es zu beobachten, wenn es es erstellt, und dann aufhören, es zu beobachten, wenn es den Besitz aufgibt. Wenn dies in Ihrem Design nicht machbar ist, können Sie das Objekt seinen Beobachter entfernen lassen, wenn die Zuweisung aufgehoben wird. Wenn es sich um ein Fire-and-Forget handelt (im Grunde kümmert sich der Delegierte nur einmal darum), könnten Sie den Beobachter nach der ersten Änderungsmitteilung entfernen. Da Sie die Beobachtung jedoch innerhalb des Erstellungslebenszyklus dieses Objekts erstellt haben, ist es wahrscheinlich am besten, diese Beobachtung bei der Zerstörung des Objekts zu entfernen:

- (void)dealloc
{
  [self removeObserver:[NSApp delegate] forKeyPath:@"name"];
  // other clean-up
  [super dealloc];
}

Sie können dies auch tun, wenn das Objekt aus dem Abrufen und aus dem Fehler erwacht, und den Beobachter freigeben, wenn das Objekt zu einem Fehler wird.


Beantwortet von –
Jason Coco


Antwort geprüft von –
Senaida (FixError Volunteer)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like