Benachrichtige die übergeordnete Entität, wenn sich die untergeordnete Entität in den Core-Daten ändert

8

Ist es möglich, einen Rückruf oder eine Benachrichtigung in der übergeordneten Entität zu erhalten, wenn sich ein Beziehungsobjekt ändert? Dies funktioniert hervorragend, wenn sich ein Attribut der Entity ändert. Die folgende Methode ...

- (void)didChangeValueForKey:(NSString *)key

wird in meiner Entity-Unterklasse aufgerufen. Diese Methode wird jedoch nicht aufgerufen, wenn sich ein Attribut in einer der Beziehungen ändert.

Ich versuche das timeStamp-Attribut in meiner übergeordneten Entität zu aktualisieren, wenn sich eines seiner Attribute oder Beziehungsobjekte ändert.

    
Nate Potter 11.10.2011, 18:26
quelle

2 Antworten

5

Die übergeordnete Entität kann sich selbst als Beobachter der Beziehung festlegen und wird benachrichtigt, wenn sich diese Beziehung ändert. Dies wird jedoch nur ausgelöst, wenn die tatsächliche Beziehung (Hinzufügen oder Entfernen eines untergeordneten Elements) auftritt.

Es ist viel schwieriger, nach einer bestimmten untergeordneten Entität zu suchen. Es gibt ein paar Möglichkeiten:

  1. Lassen Sie das Kind den Elternteil anpingen, wenn sich seine Eigenschaften ändern.
  2. Lassen Sie den Eltern nach NSManagedObjectContextDidSaveNotification zuhören und nachsehen, ob sich eines seiner Kinder in diesem Speicher befindet
  3. Lassen Sie die Eltern die Werte der Kinder beobachten.

Es kann andere Lösungen geben, aber von den drei empfehle ich # 2. Es ist ziemlich einfach einzurichten und der Leistungseinfluss ist ziemlich minimal.

    
Marcus S. Zarra 11.10.2011, 18:49
quelle
1

In der anderen Antwort fand ich 1,2 und 3 zu ineffizient. Vor allem 2 und das Beispiel im "Parent Watching it's Child" -Blogbeitrag. Mein Problem damit ist, dass jeder einzelne Elternteil auf die Kontextbenachrichtigung und im Wesentlichen jedes Objekt, das gespeichert wird, reagieren muss, wenn es das Kind ist (ungeachtet der Tatsache, dass ContextDidSave in diesem Fall besser geeignet ist!). Stattdessen würde ich eine Option 4 vorschlagen:

  1. Lassen Sie das Kind didSave überschreiben und senden Sie eine NSManagedObjectContextDidSaveNotification mit dem Elternteil.

Meine Lösung ist effizienter und fühlt sich objektorientierter an, da das Objekt, das sich verändert, auf seine eigenen Veränderungen reagiert. Um dies zu implementieren, verwenden Sie innerhalb des untergeordneten Objekts:

%Vor%

Um den übergeordneten Zeitstempel zu aktualisieren, verwenden Sie die folgende übersichtliche Lösung ( vorletzter Beitrag ), die ich benutze, könnte helfen, zB in der Elternverwendung:

%Vor%     
malhal 29.04.2015 11:59
quelle