Hé, je travaille sur la couche de modèle pour notre application ici.
Certaines des exigences sont les suivantes:
- Cela devrait fonctionner sur iPhone OS 3.0+.
- La source de nos données est une application RESTful Rails.
- Nous devons mettre en cache les données localement à l'aide de Core Data.
- Le code client (nos contrôleurs d'interface utilisateur) doit avoir le moins de connaissances possible sur les éléments du réseau et doit interroger / mettre à jour le modèle avec l'API Core Data.
J'ai vérifié la session WWDC10 117 sur la construction d' une expérience utilisateur conduite par le serveur, passé un certain temps à vérifier les ressources Objectif , des ressources essentielles et RestfulCoreData frameworks .
Le framework Objective Resource ne parle pas seul aux données de base et est simplement une implémentation de client REST. La ressource principale et RestfulCoreData supposent tous que vous parlez à Core Data dans votre code et ils résolvent tous les écrous et boulons en arrière-plan sur la couche de modèle.
Tout semble bien jusqu'à présent et au départ, je pensais que Core Resource ou RestfulCoreData couvrirait toutes les exigences ci-dessus, mais ... Il y a quelques choses qu'aucune d'entre elles ne semble résoudre correctement:
- Le thread principal ne doit pas être bloqué lors de l'enregistrement des mises à jour locales sur le serveur.
- Si l'opération d'enregistrement échoue, l'erreur doit être propagée à l'interface utilisateur et aucune modification ne doit être enregistrée dans le stockage Core Data local.
Core Resource envoie toutes ses demandes au serveur lorsque vous appelez - (BOOL)save:(NSError **)error
votre contexte d'objet géré et peut donc fournir une instance NSError correcte des demandes sous-jacentes au serveur échouent d'une manière ou d'une autre. Mais il bloque le thread appelant jusqu'à ce que l'opération d'enregistrement se termine. ÉCHOUER.
RestfulCoreData garde vos -save:
appels intacts et n'introduit aucun temps d'attente supplémentaire pour le thread client. Il surveille simplement le NSManagedObjectContextDidSaveNotification
, puis émet les requêtes correspondantes au serveur dans le gestionnaire de notifications. Mais de cette façon, l' -save:
appel se termine toujours avec succès (enfin, étant donné que Core Data est d'accord avec les modifications enregistrées) et le code client qui l'a réellement appelé n'a aucun moyen de savoir que la sauvegarde n'a pas pu se propager au serveur à cause de certains 404
ou421
ou quoi que une erreur côté serveur s'est produite. Et plus encore, le stockage local devient d'avoir les données mises à jour, mais le serveur ne connaît jamais les changements. ÉCHOUER.
Donc, je recherche une solution possible / des pratiques courantes pour traiter tous ces problèmes:
- Je ne veux pas que le thread appelant se bloque à chaque
-save:
appel pendant que les requêtes réseau se produisent. - Je souhaite en quelque sorte recevoir des notifications dans l'interface utilisateur indiquant qu'une opération de synchronisation a mal tourné.
- Je veux que la sauvegarde des données de base échoue également si les demandes du serveur échouent.
Des idées?