Toms Bindingsartikel: "Durchführen der Observation"

  • Toms Bindingsartikel: "Durchführen der Observation"

    Hallo,

    ich feile wieder am KVO meines Views. Da waren doch noch einige Bugs drin... manchmal hat mein verwendeter Algorithmus Observer entfernt wo keine waren.

    Den Fehler habe ich auch schnell gefunden - nur mit der Lösung nicht so wirklich.

    Ich observiere ja n-Objekte (to-many), die sich alle von einem NSArrayController verwalten lassen (CoreData eben). Mein Gedanke war nun einfach die arrangedObjects zu observieren und mit den Options NSKeyValueChangeNewKey/Old an die Information über Änderungen informiert zu werden. Denkste. Musste feststellen, dass beim NSArrayController diese Optionen noch nicht implementiert wurden oder es ein bekannter Bug ist.

    Die Lösung des Problems steht ja am Ende von Toms Artikel.

    macentwicklerwelt.net/doku.php?id=wiki:key-value-observing

    Stutzig macht mich der letzte Punkt:

    "Kopiere das neue Array in das alte."

    Ist hier mit "Kopiere" ein Kopieren mit copy gemeint oder eine einfache Zuweisung? Falls eine Kopie gemeint ist wirds schwer, sobald man mit NSManagedObjects arbeitet, da diese ja kein NSCopying implementieren. Too bad.

    Falls mit Kopieren eine einfache Zuweisung gemeint ist habe ich ein anderes Verständnisproblem:

    Punkt 2: "Entferne alle Elemente, die bereits im alten Array bekannt waren."

    Punkt 4: "Hole altes Array".

    Wie soll ich Punkt 2 erfüllen ohne zunächst Punkt 4 erfüllt zu haben? Ohne altes Array kann ich ja schlcht alle Elemente, die bereits im alten bekannt waren entfernen.

    Danke. :)

    Edit: Zur Konkretisierung - hier ein Ausschnitt meiner:

    Quellcode

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


    Implementierung, die natürlich falsch ist... dient nur der Vorbeugung von Misverständnissen:

    Quellcode

    1. // Hole neues Array.
    2. NSMutableSet *neuesSet = [newDeck mutableSetValueForKey:@"cards"];
    3. // Hole altes Array
    4. NSMutableSet *altesSet = [self oldCards];
    5. // Entferne alle Elemente, die bereits im alten Array bekannt waren.
    6. [neuesSet minusSet:altesSet];
    7. // Observiere den Rest
    8. [self _addAsObserver:[neuesSet allObjects]];
    9. // Hole das alte array (hab ich schon)
    10. // Entferne alle Elemente, die im neuen Array enthalten sind.
    11. [altesSet minusSet:neuesSet];
    12. // Lösche Observierungen des Restes.
    13. [self _removeAsObserver:[altesSet allObjects]];
    14. // Kopiere das neue Array in das alte.
    15. [self setOldCards:neuesSet];
    Alles anzeigen
    Die Objective-Cloud ist fertig wenn sie fertig ist. Beta heißt Beta.

    Objective-C und Cocoa Band 2: Fortgeschrittene
    Cocoa/Objective-C Seminare von [co coa:ding].
  • RE: Toms Bindingsartikel: "Durchführen der Observation"

    Sieht eigentlich ganz gut aus, und Deine Anmerkung zu 4 ist auch richtig. Zum Vergleich ist hier der entsprechende Code von GraphicBinding

    Quellcode

    1. {
    2. /*
    3. Should be able to use
    4. NSArray *oldGraphics = [change objectForKey:NSKeyValueChangeOldKey];
    5. etc. but the dictionary doesn't contain old and new arrays.
    6. */
    7. NSArray *newGraphics = [object valueForKeyPath:[self graphicsKeyPath]];
    8. NSMutableArray *onlyNew = [newGraphics mutableCopy];
    9. [onlyNew removeObjectsInArray:oldGraphics];
    10. [self startObservingGraphics:onlyNew];
    11. [onlyNew release];
    12. NSMutableArray *removed = [oldGraphics mutableCopy];
    13. [removed removeObjectsInArray:newGraphics];
    14. [self stopObservingGraphics:removed];
    15. [removed release];
    16. [self setOldGraphics:newGraphics];
    17. // could check drawingBounds of old and new, but...
    18. [self setNeedsDisplay:YES];
    19. return;
    20. }
    Alles anzeigen
    Dasselbe Prinzip: 2 Sammlungen ('NSSet' oder 'NSArray') vergleichen, und die nicht in beiden vorhandenen Objekte zum Beobachten hinzufügen oder eben entfernen.
    I would be embarrassed if they did not spy on me.
  • RE: Toms Bindingsartikel: "Durchführen der Observation"

    Mit Kopieren ist in der Tat nur gemeint, dass du den Zeiger auf dsa Array kopierst und nicht das Array. Aber das wäre auch egal: Bedenke, dass das Array ja auch nur aus Zeigern besteht, enie Kopie des Arrays also nicht eine Kopie der im Array enthatenen Objekte bedeutet!
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Hallo nochmal.

    Danke dir.

    Quellcode

    1. [newGraphics mutableCopy];


    War mir nicht klar, dass ich mutableCopy auf einen Container, der Elemente enthält, die nicht NSCopying/MutableCopying imeplementieren anwenden darf. Das klärt einiges.

    Ich versuche mich mal an der Umsetzung mit dem neuen Wissen und melde mich bei Problemen wieder.
    Die Objective-Cloud ist fertig wenn sie fertig ist. Beta heißt Beta.

    Objective-C und Cocoa Band 2: Fortgeschrittene
    Cocoa/Objective-C Seminare von [co coa:ding].