He estado trabajando en una aplicación que maneja este comportamiento exacto durante los últimos 2 meses más o menos. Tiene un pequeño subconjunto de funciones que están solo en línea y un gran conjunto de funcionalidades fuera de línea/en línea.
Estoy usando sqlite para el almacenamiento local como se sugiere aquí con una versión modificada de la biblioteca sqlitepersistentobjects. La versión base de sqlitepersistentobjects no es segura para subprocesos, así que ten cuidado si la estás usando. (consulte el registro de objetivos en: objectivesync para obtener una alternativa segura para hilos, pero prepárese para profundizar en el código). Si está dispuesto a desarrollar para la sdk 3.0, entonces los datos centrales son otra posibilidad para una biblioteca sqlite.
La arquitectura general es lo suficientemente simple He modelado el almacenamiento local usando sqlite y la interacción remota usando objective resource en una aplicación de rieles y REST api. Puede usar xml o json para la serialización de datos.
Cuando un objeto se modifica localmente, el cambio se guarda primero en el registro de la base de datos sqlite para ese objeto y luego se agrega a una cola que se serializa y almacena también en el archivo sqlite local db. (La cola puede procesarse en cualquier momento)
Si hay una conexión disponible, los cambios locales en cola se deserializan y se agregan a un NSOperationQueue que luego los procesa en segundo plano.
Para hacer que todo esto funcione, he subclasificado NSOperation para que pueda admitir varios tipos de operaciones de cola remota: crear, actualizar, eliminar utilizando esencialmente el recurso objetivo para realizar las solicitudes remotas.
Lo bueno de utilizar NSOperationQueue y NSOperation es que manejan el subprocesamiento de fondo para usted, así que recomiendo echar un vistazo a los documentos de Apple para esas clases y también a la manzana threading guide.
Cuando se carga la aplicación, se realiza un poco de control remoto y se procesa en segundo plano para extraer los datos más recientes, aunque para ser honesto, todavía estoy cambiando la forma en que esto se comporta un poco.
Esa es una descripción rápida de lo que he tenido que enfrentar hasta ahora ... espero que ayude un poco.
Secundo esta pregunta, y añadir que me gustaría saber acerca de las estrategias para la fusión datos fuera de sincronización. Ponerse en contacto con un servidor para sincronizar es una obviedad. La parte difícil es descubrir cómo combinar los datos del servidor con los datos locales. – Alex