Ehi, sto lavorando al livello del modello per la nostra app qui.
Alcuni dei requisiti sono come questo:
- Dovrebbe funzionare su iPhone OS 3.0+.
- La fonte dei nostri dati è un'applicazione RESTful Rails.
- Dovremmo memorizzare nella cache i dati localmente utilizzando Core Data.
- Il codice client (i nostri controller dell'interfaccia utente) dovrebbe avere la minima conoscenza possibile di qualsiasi cosa di rete e dovrebbe interrogare / aggiornare il modello con la Core Data API.
Ho controllato la WWDC10 Session 117 sulla creazione di un'esperienza utente basata su server, ho passato un po 'di tempo a controllare Objective Resource , Core Resource e RestfulCoreData framework .
Il framework Objective Resource non parla da solo con Core Data ed è semplicemente un'implementazione del client REST. Core Resource e RestfulCoreData presumono che tu parli con Core Data nel tuo codice e risolvono tutti i dadi e i bulloni in background sul livello del modello.
Finora tutto sembra a posto e inizialmente pensavo che Core Resource o RestfulCoreData coprissero tutti i requisiti di cui sopra, ma ... Ci sono un paio di cose che nessuno di loro sembra risolvere correttamente:
- Il thread principale non deve essere bloccato durante il salvataggio degli aggiornamenti locali sul server.
- Se l'operazione di salvataggio non riesce, l'errore deve essere propagato all'interfaccia utente e nessuna modifica deve essere salvata nell'archivio dati di base locale.
Core Resource emette tutte le sue richieste al server quando si richiama - (BOOL)save:(NSError **)error
il contesto dell'oggetto gestito e quindi è in grado di fornire un'istanza NSError corretta delle richieste sottostanti al server in qualche modo non riuscita. Ma blocca il thread chiamante fino al termine dell'operazione di salvataggio. FALLIRE.
RestfulCoreData mantiene -save:
intatte le chiamate e non introduce alcun tempo di attesa aggiuntivo per il thread del client. Si limita a controllare NSManagedObjectContextDidSaveNotification
e quindi invia le richieste corrispondenti al server nel gestore delle notifiche. Ma in questo modo la -save:
chiamata viene sempre completata correttamente (beh, dato che Core Data va bene con le modifiche salvate) e il codice client che effettivamente lo ha chiamato non ha modo di sapere che il salvataggio potrebbe non essere riuscito a propagarsi al server a causa di alcuni 404
o421
o qualsiasi altra cosa si è verificato un errore lato server. E ancora di più, l'archiviazione locale diventa per aggiornare i dati, ma il server non viene mai a conoscenza delle modifiche. FALLIRE.
Quindi, sto cercando una possibile soluzione / pratiche comuni per affrontare tutti questi problemi:
- Non voglio che il thread chiamante si blocchi su ogni
-save:
chiamata mentre si verificano le richieste di rete. - Voglio in qualche modo ricevere notifiche nell'interfaccia utente che alcune operazioni di sincronizzazione sono andate male.
- Voglio che anche il salvataggio dei dati di base effettivi fallisca se le richieste del server falliscono.
Qualche idea?