Core Data und UI Synchronisierung

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Core Data und UI Synchronisierung

    Moinsen,

    ich habe mal eine generelle Frage. Im UI will man ja keine ManagedObject Objekte erzeugen, sondern dies eher einer Data Management Klasse überlassen. Nun stellt sich das Problem, dass man zum Beispiel eine Tabelle aktualisieren will und das neue Objekt dort bereits angezeigt werden soll, wenn man den Dialog für das Anlegen des neuen Objektes schliesst.

    Jetzt kann es aber passieren, dass Core Data das neue Objekt noch gar nicht im Store erzeugt hat und somit im FetchRequest noch nicht enthalten ist.
    Wie würdet Ihr das lösen? Über eine NSNotification? Was macht man aber, wenn man mehrere Stores hat, die jedes Mal eine Notification beim Speichern werfen? Dann würde man das UI ja mehrmals aktualisieren, was man vielleicht gar nicht will?

    Bin gespannt.

    Cheers. Kay.
  • Wahrscheinlich keine gute Antwort von mir, aber ich habe es bei mir so gelöst, dass mir die Datenklasse einen Rückgabe-Bool für den Erfolg der Speicherung liefert und mit dispatch after warte ich ein wenig drauf ;(

    Ansonsten läuft es halt in der Viewklasse. Breche ich mir auch kein Bein mit ab, der ManagedObjectContext wird sowieso in meinen Apps stets aufs neue gefetched.

    Sorry für die wahrscheinlich doofe Antwort
    Karin
  • Na ja, wie gewohnt, wenn es in 2 Sekunden nicht klappt, habe nicht viel, dann geht es eh nicht ordentlich.
    Den ganzen weiteren Tabellenkram, der für meine Anwendung wichtig ist, habe ich mal rausgeschnitten.

    Quellcode

    1. double delayInSeconds = 2.5;
    2. dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
    3. dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    4. self.tableView.tableHeaderView = nil;
    5. [self.tableView setContentOffset:CGPointMake(0,0) animated:YES];
    6. ...
    7. if (newDataBool) {
    8. } else ...
    9. });


    Ich warte halt 2 oder mehr Sekunden und auf dem main_queue führe ich dann den relevanten Code aus.

    Ist nicht hübsch, aber bei maximal 100 meiner DS reicht die Zeit locker.

    Viele Grüße
    Karin
  • Ich hab ne Idee. Die DataHandler Klasse observed einfach die Standard Notification, aber nur für einen dezidierten ManagedObjectContext.

    Quellcode

    1. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(managedObjectContextDidSave) name:NSManagedObjectContextDidSaveNotification object:self.managedObjectContext];
    Dann wirds auch nur einmal aufgerufen!
  • Hi Kay, ich mache es meistens so, dass ich in dem View Controller, der die Tabelle enthält, das MO erzeuge. Dazu nutze ich Delegation. Wenn ich zum Beispiel ein Sheet habe, in dem die Daten eingegeben werden, dann schicke ich dem Delegate eine Message und der View Controller erzeugt dann das Objekt. Wenn dann das save des MOC erfolgreich war, dann wird die Tabelle aktualisiert.. Wenn das genau das ist, was du nicht willst, dann disregard.. ;-))