ios - phoneclean - que pasa si borro los datos de facebook
Datos principales en el cliente(iOS) para almacenar datos en caché desde un servidor Estrategia (3)
He escrito muchas aplicaciones de iOS que se estaban comunicando con el servidor. Casi siempre, utilicé el caché de HTTP para almacenar en caché las consultas y analizar los datos de respuesta (JSON) en objetos Object-C. Para este nuevo proyecto, me pregunto si un enfoque de Core Data tendría sentido.
Esto es lo que pensé:
El cliente de iOS realiza una solicitud al servidor y analiza los objetos desde JSON hasta los modelos de CoreData.
Cada vez que necesito un objeto nuevo, en lugar de buscar el servidor directamente, analizo CoreData para ver si ya hice esa solicitud. Si ese objeto existe y no ha expirado, uso el objeto recuperado.
Sin embargo, si el objeto no existe o ha expirado (se aplicaría aquí alguna lógica de almacenamiento en caché), buscaría el objeto desde el servidor y actualizaría CoreData en consecuencia.
Creo que tener una arquitectura así podría ayudar con lo siguiente: 1. Evitar consultas innecesarias al servidor 2. Permitir un soporte completo para la exploración sin conexión (Aún puede realizar consultas relacionales con el RDBMS de DataCore)
Ahora aquí está mi pregunta a SO Dioses:
- Sé que esto requiere codificar la lógica de back-end por segunda vez (Server + CoreData) pero ¿es esto exagerado?
- ¿Alguna limitación que haya subestimado?
- ¿Alguna otra idea?
Creo que es un enfoque válido. Lo he hecho varias veces. La parte difícil es cuando tienes que lidiar con la sincronización: si el cliente y el servidor pueden cambiar las cosas al mismo tiempo. Casi siempre necesita lógica de fusión específica de la aplicación para esto.
En primer lugar, si eres un desarrollador de iOS registrado, deberías tener acceso a las sesiones de la WWDC 2010. Una de esas sesiones cubrió un poco de lo que está hablando: "Sesión 117, Creación de una experiencia de usuario basada en el servidor". Deberías poder encontrarlo en iTunes .
Una combinación inteligente de REST / JSON / Core Data funciona como un encanto y ahorra mucho tiempo si planea reutilizar su código, pero requerirá conocimiento sobre HTTP (y conocimiento sobre Core Data, si desea que sus aplicaciones rindan bien y seguro).
Entonces la clave es entender REST y Core Data.
Comprender REST significa comprender los métodos HTTP (GET, POST, PUT, DELETE, ... HEAD?) Y Response-Codes (2xx, 3xx, 4xx, 5xx) y encabezados (Last-Modified, If-Modified-Since, Etag,. ..)
La comprensión de los datos básicos significa saber cómo diseñar su modelo, establecer relaciones, manejar operaciones que requieren mucho tiempo (elimina, inserta, actualizaciones) y cómo hacer que las cosas sucedan en segundo plano para que su UI se mantenga receptiva. Y, por supuesto, cómo consultar localmente en sqlite (por ejemplo, para la obtención previa de identificadores para que pueda actualizar objetos en lugar de crear nuevos una vez que obtenga los equivalentes del lado del servidor).
Si planea implementar una API reutilizable para las tareas que mencionó, debe asegurarse de comprender los datos REST y Core Data, ya que es donde probablemente hará la mayor parte de la codificación. (Las API existentes - ASIHttpRequest para la capa de red (o cualquier otra) y cualquier buena lib JSON (por ejemplo, SBJSON ) para el análisis harán el trabajo.
La clave para simplificar dicha API es hacer que su servidor proporcione un Servicio RESTful, y sus Entidades que tengan los atributos requeridos (dateCreated, dateLastModified, etc.) para que pueda crear Solicitudes (fáciles de realizar con ASIHttpRequest, ya sea GET, PUT, POST, DELETE) y agregue los Http-Headers apropiados, p. Ej. Para un GET condicional: If-Modified-Since.
Si ya te sientes cómodo con Core Data y puedes manejar JSON y puedes hacer fácilmente HTTP Request y manejar Responses (de nuevo, ASIHttpRequest ayuda mucho aquí, pero hay otros, o puedes apegarte a las clases NS de nivel inferior y hacer usted mismo), todo lo que necesita es establecer los Encabezados HTTP correctos para sus Solicitudes, y manejar los Códigos de Respuesta HTTP adecuadamente (asumiendo que su Servidor es REST-ful).
Si su objetivo principal es evitar volver a actualizar una entidad Core-Data desde un servidor equivalente, simplemente asegúrese de tener un atributo "last-modified" en su entidad, y realice un GET condicional en el servidor (configurando el "If-Modified-Since" Http-Header a la fecha de su última "modificación" de entidades. El servidor responderá con el código de estado 304 (no modificado) si ese recurso no cambió (suponiendo que el servidor es REST-ful) Si ha cambiado, el servidor configurará el Http-Header "Last-Modified" a la fecha en que se realizó el último cambio, responderá con Status-Code 200 y entregará el recurso en el cuerpo (por ejemplo, en formato JSON).
Entonces, como siempre, la respuesta es que su pregunta es, como siempre, probablemente ''depende''. En su mayor parte, depende de lo que le gustaría poner en su capa reutilizable de datos básicos / descanso.
Para contarle los números: tardé 6 meses (en mi tiempo libre, a un ritmo de 3 a 10 horas por semana) en tener el mío donde yo quería que fuera, y sinceramente todavía estoy refabricando, renombrando, para dejarlo manejar casos de uso especiales (cancelación de solicitudes, retrotraer, etc.) y proporcionar call-backs refinados (accesibilidad, capa de red, serialización, almacenamiento de datos centrales ...). Pero es bastante limpio, elaborado y optimizado y, con suerte, se adapta a las necesidades generales de mi empleador (un mercado en línea para los clasificados con múltiples aplicaciones de iOS). Ese tiempo incluía hacer aprendizaje, probar, optimizar, depurar y cambiar constantemente mi API (Primera funcionalidad de adición, luego mejorarla, luego simplificarla radicalmente y depurarla de nuevo).
Si el tiempo de comercialización es su prioridad, estará mejor con un enfoque simple y pragmático: no olvide reutilizar, simplemente tenga en cuenta los aprendizajes, y refactorice en el próximo proyecto, reutilizando y reparando códigos aquí y allá. Al final, la suma de todas las experiencias podría materializarse en una visión clara de CÓMO funciona su API y lo que proporciona. Si todavía no has llegado, trata de hacer que forme parte del presupuesto del proyecto, y trata de reutilizar la mayor cantidad posible de API 3''rd-Party estables.
Perdón por la respuesta larga, sentí que estaban entrando en algo como construir una API genérica o incluso un marco. Esas cosas toman tiempo, conocimiento, limpieza y compromiso a largo plazo, y la mayoría de las veces, son una pérdida de tiempo, porque nunca las terminas.
Si solo desea manejar situaciones de almacenamiento en caché específicas para permitir el uso sin conexión de su aplicación y minimizar el tráfico de red, entonces puede, por supuesto, implementar esas características. Simplemente configure los encabezados if-modified-since en su solicitud, inspeccione los encabezados o etags modificados por última vez y mantenga esa información persistente en sus entidades persistentes para que pueda volver a enviar esta información en las solicitudes posteriores. Por supuesto, también recomendaría el almacenamiento en caché (de forma persistente) de recursos, como imágenes localmente, utilizando los mismos encabezados HTTP.
Si tiene el lujo de modificar (de forma REST-ful) el servicio del lado del servidor, está bien, siempre que lo implemente bien (por experiencia, puede guardar tanto como 3/4 del código de red / análisis iOS si el servicio se comporta bien (devuelve los códigos de estado HTTP apropiados, evita las comprobaciones nulas, las transformaciones numéricas de las cadenas, las fechas, proporciona id de búsqueda en lugar de cadenas implícitas, etc.).
Si no tiene ese lujo, entonces ese servicio es al menos REST-ful (lo que ayuda mucho), o tendrá que arreglar las cosas del lado del cliente (lo cual es un problema, a menudo).
Hay una solución por ahí que no pude probar porque estoy demasiado lejos en mi proyecto para refactorizar el aspecto de almacenamiento en caché de mi aplicación, pero debería ser útil para las personas que todavía están buscando una respuesta:
Hace exactamente lo que hice, pero es mucho más abstracto que lo que hice. Cosas muy perspicaces allí. ¡Espero que ayude a alguien!