Hola, estoy trabajando en la capa de modelo para nuestra aplicación aquí.
Algunos de los requisitos son así:
- Debería funcionar en iPhone OS 3.0+.
- La fuente de nuestros datos es una aplicación RESTful Rails.
- Deberíamos almacenar en caché los datos localmente usando Core Data.
- El código del cliente (nuestros controladores de interfaz de usuario) debe tener el menor conocimiento posible sobre las cosas de la red y debe consultar / actualizar el modelo con la API de datos centrales.
Revisé la sesión 117 de la WWDC10 sobre la creación de una experiencia de usuario impulsada por el servidor, pasé un tiempo revisando los marcos Objective Resource , Core Resource y RestfulCoreData .
El marco de Objective Resource no habla con Core Data por sí solo y es simplemente una implementación de cliente REST. Core Resource y RestfulCoreData asumen que usted habla con Core Data en su código y ellos resuelven todos los aspectos prácticos en segundo plano en la capa del modelo.
Todo parece estar bien hasta ahora e inicialmente pensé que Core Resource o RestfulCoreData cubrirán todos los requisitos anteriores, pero ... Hay un par de cosas que aparentemente ninguna de ellas resuelve correctamente:
- El hilo principal no debe bloquearse mientras se guardan las actualizaciones locales en el servidor.
- Si la operación de guardado falla, el error debe propagarse a la interfaz de usuario y no debe guardarse ningún cambio en el almacenamiento de datos principales local.
Core Resource emite todas sus solicitudes al servidor cuando llama - (BOOL)save:(NSError **)error
a su Contexto de objeto administrado y, por lo tanto, puede proporcionar una instancia NSError correcta de las solicitudes subyacentes al servidor que fallan de alguna manera. Pero bloquea el hilo de llamada hasta que finaliza la operación de guardar. FALLAR.
RestfulCoreData mantiene sus -save:
llamadas intactas y no introduce ningún tiempo de espera adicional para el hilo del cliente. Simplemente vigila NSManagedObjectContextDidSaveNotification
y luego emite las solicitudes correspondientes al servidor en el controlador de notificaciones. Pero de esta manera la -save:
llamada siempre se termina con éxito (así, teniendo en cuenta los datos de la base es bien con los cambios guardados) y el código de cliente que llama en realidad no tiene manera de saber el ahorro podría haber fallado para propagar al servidor debido a alguna 404
o 421
o lo que sea Ocurrió un error del lado del servidor. Y aún más, el almacenamiento local pasa a tener los datos actualizados, pero el servidor nunca se entera de los cambios. FALLAR.
Entonces, estoy buscando una posible solución / prácticas comunes para lidiar con todos estos problemas:
- No quiero que el hilo de llamada se bloquee en cada
-save:
llamada mientras ocurren las solicitudes de red. - Quiero de alguna manera recibir notificaciones en la interfaz de usuario de que alguna operación de sincronización salió mal.
- Quiero que el guardado de Core Data también falle si fallan las solicitudes del servidor.
¿Algunas ideas?