Hintergrund
Ich habe bereits eine Frage zu den Grundlagen von Freigabe eines Core Data Store zwischen Prozessen .
Ich versuche, die gegebenen Empfehlungen umzusetzen, und ich stoße auf Probleme.
Mein Ziel
Ich habe zwei Prozesse - die Helfer-App und die Benutzeroberfläche. Sie teilen sich einen einzigen Datenspeicher. Ich möchte, dass die Benutzeroberfläche ihren NSManagedObjectContext aktualisiert, wenn die Helper-App neue Daten im Speicher gespeichert hat.
Aktueller Programmablauf
Der Helper-App-Prozess schreibt Daten in den Speicher.
In der Helper-App höre ich nach NSManagedObjectContextDidSaveNotification-Benachrichtigungen.
Wenn der Kontext gespeichert wird, kodiere ich die eingefügten, gelöschten und aktualisierten Objekte mithilfe ihrer URI-Repräsentationen und NSArchiver.
Ich sende eine NSNotification an das NSDistributedNotificationCenter mit diesem codierten Wörterbuch als userInfo.
Der UI-Prozess wartet auf die Speicherbenachrichtigung. Wenn die Benachrichtigung empfangen wird, wird die Benutzerinfo mit NSUnarchiver entpackt.
Es werden alle aktualisierten / eingefügten / gelöschten Objekte aus den angegebenen URIs gesucht und durch NSManagedObjects ersetzt.
Er erstellt eine NSNotification mit den aktualisierten / eingefügten / gelöschten Objekten.
Ich rufe mergeChangesFromContextDidSaveNotification auf: Führe im Kontext des verwalteten Objekts des UI-Prozesses die NSNotification ein, die ich im vorherigen Schritt erstellt habe.
Das Problem
Eingefügte Objekte werden in die Feineinstellung für den verwalteten Objektkontext des UI fehlerhaft und in der Benutzeroberfläche angezeigt. Das Problem kommt mit aktualisierten Objekten. Sie aktualisieren nur nicht.
Was ich versucht habe
Die offensichtlichste Sache zu versuchen wäre um die sichere Benachrichtigung zu übergeben vom Helper App Prozess zum UI-Prozess. Einfach richtig? Nun, nein. Verteilte Benachrichtigungen werden nicht erlaube mir das als userInfo zu tun Wörterbuch ist nicht richtig Format. Deshalb mache ich all das NSArchivierungskram.
Ich habe versucht, anzurufen refreshObject: mergeChanges: Ja ein die NSManagedObjects, die aktualisiert werden sollen, aber das scheint das nicht zu haben Wirkung.
Ich habe versucht, die mergeChangesFromContextDidSaveNotification: Selektor auf dem Hauptfaden und der aktueller Thread Weder scheint das zu sein beeinflussen das Ergebnis.
Ich habe es versucht mergeChangesFromContextDidSaveNotification: vorher zwischen Threads, welche von Natürlich ist es viel einfacher und es hat funktioniert perfekt. Aber ich brauche das Gleiche Funktionalität zwischen Prozessen.
Alternativen?
Fehle ich hier etwas? Ich habe ständig das Gefühl, dass ich das viel komplexer mache, als es sein muss, aber nachdem ich die Dokumentation mehrmals gelesen und ein paar solide Tage damit verbracht habe, sehe ich keinen anderen Weg, den MOC zu erneuern die Benutzeroberfläche.
Gibt es eine elegantere Art, dies zu tun? Oder mache ich irgendwo in meinem Code einen dummen Fehler?
Der Code
Ich habe versucht, es so leserlich wie möglich zu machen, aber es ist immer noch ein Durcheinander. Entschuldigung.
Helfer-App-Code
%Vor%UI-Code
%Vor%Sie suchen nach - (void) refreshObject: (NSManagedObject *) Objekt mergeChanges: (BOOL) Flag glaube ich.
Dadurch wird das Objekt mit den Informationen im persistenten Speicher aktualisiert, wobei Änderungen bei Bedarf zusammengeführt werden.
Ich würde mit Mikes Vorschlag gehen und einfach die Filialdatei nach Änderungen beobachten.
Obwohl es möglicherweise nicht die effizienteste Lösung ist, habe ich - [NSManagedObjectContext reset]
erfolgreich aus einem zweiten Prozess verwendet, wenn ein Store geändert wurde. In meinem Fall ist der Code ziemlich linear - alles was ich tue ist eine Fetch-Anfrage für einige Daten nach dem Zurücksetzen auszuführen. Ich weiß nicht, wie dies mit Bindings und einer komplizierten Benutzeroberfläche funktioniert, aber Sie können möglicherweise eine Benachrichtigung posten, um Dinge manuell zu aktualisieren, wenn dies nicht automatisch geschieht.
Dies funktioniert, außer für Sandbox-Apps. Sie können keine Benachrichtigung mit einem Benutzer-Info-Diktat senden. Betrachten Sie stattdessen einen anderen IPC wie XPC oder DO.
Nebenbei bemerkt ist die Verwendung von NSDustributedNotificationCenter nicht immer 100%, wenn das System beschäftigt ist.