Hey, ich arbeite hier an der Modellebene für unsere App.
Einige der Anforderungen lauten wie folgt:
- Es sollte unter iPhone OS 3.0+ funktionieren.
- Die Quelle unserer Daten ist eine RESTful Rails-Anwendung.
- Wir sollten die Daten lokal mit Core Data zwischenspeichern.
- Der Client-Code (unsere UI-Controller) sollte so wenig Wissen wie möglich über Netzwerkmaterialien haben und das Modell mit der Core Data API abfragen / aktualisieren.
Ich habe die WWDC10-Sitzung 117 zum Erstellen einer servergesteuerten Benutzererfahrung ausgecheckt und einige Zeit damit verbracht, die Frameworks Objective Resource , Core Resource und RestfulCoreData zu überprüfen .
Das Objective Resource Framework kommuniziert nicht alleine mit Core Data und ist lediglich eine REST-Client-Implementierung. Die Core Resource und RestfulCoreData setzen alle voraus, dass Sie in Ihrem Code mit Core Data sprechen, und lösen alle Schrauben und Muttern im Hintergrund auf der Modellebene.
Bis jetzt sieht alles in Ordnung aus und anfangs denke ich, dass entweder Core Resource oder RestfulCoreData alle oben genannten Anforderungen abdecken, aber ... Es gibt ein paar Dinge, die scheinbar nicht richtig gelöst werden:
- Der Hauptthread sollte nicht blockiert werden, während lokale Updates auf dem Server gespeichert werden.
- Wenn der Speichervorgang fehlschlägt, sollte der Fehler an die Benutzeroberfläche weitergegeben werden und es sollten keine Änderungen im lokalen Kerndatenspeicher gespeichert werden.
Core Resource gibt zufällig alle seine Anforderungen an den Server aus, wenn Sie - (BOOL)save:(NSError **)error
Ihren Managed Object Context aufrufen, und kann daher eine korrekte NSError-Instanz der zugrunde liegenden Anforderungen an den Server bereitstellen, die irgendwie fehlschlagen. Der aufrufende Thread wird jedoch blockiert, bis der Speichervorgang abgeschlossen ist. SCHEITERN.
RestfulCoreData hält Ihre -save:
Anrufe intakt und führt keine zusätzliche Wartezeit für den Client-Thread ein. Es achtet lediglich auf das NSManagedObjectContextDidSaveNotification
und gibt dann die entsprechenden Anforderungen an den Server im Benachrichtigungshandler aus. Aber auf diese Weise der -save:
immer erfolgreich ausgeführt wird (gut, da Core Data ist in Ordnung mit den gespeicherten Änderungen) und dem Client - Code, der tatsächlich nannte es keine Möglichkeit , das zu wissen , hat speichern könnte versagt haben , weil einige auf den Server zu propagieren 404
oder 421
oder was auch immer Server-seitiger Fehler aufgetreten. Und noch mehr, der lokale Speicher wird die Daten aktualisieren, aber der Server weiß nie über die Änderungen. SCHEITERN.
Daher suche ich nach einer möglichen Lösung / gemeinsamen Praktiken im Umgang mit all diesen Problemen:
- Ich möchte nicht, dass der aufrufende Thread bei jedem
-save:
Anruf blockiert wird , während die Netzwerkanforderungen auftreten. - Ich möchte irgendwie Benachrichtigungen in der Benutzeroberfläche erhalten, dass ein Synchronisierungsvorgang fehlgeschlagen ist.
- Ich möchte, dass das Speichern der eigentlichen Kerndaten ebenfalls fehlschlägt, wenn die Serveranforderungen fehlschlagen.
Irgendwelche Ideen?