2015-03-02 11 views
6

Diese Frage wurde bereits gestellt, hat aber no answers erhalten.Core Data mit WatchKit und iOS App

Meine iOS-App und meine WatchKit-Erweiterung teilen sich eine App-Gruppe, in der ein Core Data-Speicher bestehen bleibt. Das Kerndatenmodell (vereinfacht) ist ein Person-Objekt, das ein Attribut für Alter hat. Sowohl die App als auch die Erweiterung können das Alter beliebig ändern.

Wenn sich der Wert für eine Person auf der Uhr ändert, wird sie in der App nicht angezeigt, es sei denn, ich schließe die App und führe sie erneut aus. Gleiches geht in die entgegengesetzte Richtung.

Wenn ich versuche, das Alter auf der Uhr 20 zu ändern, und das Alter ändert am Telefon bis 30, dann bekomme ich einen Fehler mit mit Merge Konflikten zu tun, weil ich nicht die meist up-to-bin mit Datum Version des NSManagedObject auf einem der Geräte (je nachdem, welches Alter ich zuletzt ändere).

Wie kann ich die beiden zusammenarbeiten ohne Probleme?

+0

Haben Sie versucht, NSManagedObjectContextObjectsDidChangeNotification zu abonnieren? – sash

+0

@sash Ich habe versucht, das zu tun, aber die Benachrichtigung wird immer nur auf dem Gerät aufgerufen, auf dem ich die letzte Änderung vorgenommen habe. Dies könnte jedoch eine Einschränkung des Simulators darstellen. Ich würde gerne sehen, ob diese Lösung funktionieren würde, aber ich kann nicht, weil es noch keine Uhr gibt ... – erdekhayser

Antwort

3

Da Benachrichtigungen zwischen den verschiedenen Prozessen nicht empfangen werden, müssen Sie stattdessen Darwin-Benachrichtigungen verwenden. Sie können problemlos die Methode openParentApplication:reply: verwenden, um Updates von der Watch Extension an die iOS App zu senden, aber Apple hat keine Möglichkeit, Ereignisse von der iOS App an die Watch Extension zu senden.

Ich würde vorschlagen, dass Sie MMWormhole verwenden (oder Sie besitzen Implementierung von Darwin-Benachrichtigungen), um eine Darwin-Benachrichtigung zu senden, wenn das Core Data-Objekt aktualisiert wurde. Here ist ein Artikel, der beschreibt, wie die Bibliothek funktioniert.

Wenn Sie ein Core Data-Objekt in der Überwachungserweiterung aktualisieren, senden Sie eine Darwin-Benachrichtigung an die iOS-App und teilen der App mit, dass sie das Core Data-Objekt aktualisieren muss. Der gleiche Ansatz kann in die andere Richtung von der iOS App zur Watch Extension verwendet werden.

Außerdem, wenn Sie Objekte wirklich einfach sind, dann könnte CoreData Overkill sein. Sie könnten MMWormhole verwenden, um einfach ein leichtgewichtiges Wörterbuch zwischenzuspeichern, das an beiden Enden verwendet wird. Ich benutze diesen Ansatz seit einigen Wochen und es funktioniert einwandfrei in beide Richtungen.

1

Dies geschieht, weil Sie verschiedene verwaltete Objektkontexte verwenden, die nicht über Benachrichtigungen kommunizieren können. Das Senden einer Benachrichtigung wie NSManagedObjectContextObjectsDidChangeNotification funktioniert nicht, da NSNotificationCenter die Benachrichtigung von Ihrer iOS App nicht an die Erweiterung sendet, da es sich um verschiedene Prozesse handelt, die in unterschiedlichen Speicherbereichen ausgeführt werden. Ich bin in meiner App auf dasselbe gestoßen. Sie müssen das Objekt aktualisieren, bevor Sie es verwenden. Grundsätzlich machen Sie einen manuellen Fehler. Für die Performance möchten Sie wahrscheinlich wissen, wann und wann Sie dies nicht tun sollten. Sie können das Objekt aktualisieren, indem Sie es an [NSManagedObjectContext refreshObject: mergeChanges:] übergeben.

+0

Ich habe versucht, das Objekt zu aktualisieren, bevor ich weitere Änderungen daran mache, aber die App stürzt immer noch ab, wenn ich es versuche sparen. – erdekhayser

+0

Wenn es abstürzt gibt es Fehlermeldungen in der Konsole? –

+0

'Ungelöster Fehler Optional (Fehlerdomäne = NSCOAErrorDomain-Code = 133020" Der Vorgang konnte nicht abgeschlossen werden. (Cocoa-Fehler 133020.) "' – erdekhayser