Cuello de botella de iOS: Variable global vs. Datos básicos o lists de properties

Soy nuevo en iOS y cocoa. Mi pregunta no es sobre cómo hacer que algo funcione, sino más sobre el layout para mejorar el UX y el performance.

Estoy agregando funciones a una aplicación existente. Actualmente, la aplicación tiene una class "RootViewController" (RVC) que es responsable de hacer las requestes del server. RVC llama a un server para una respuesta json. Esta respuesta json se analiza y la respuesta analizada es referenceda por un object NSArray denominado "array". Los datos que el server proporciona a "array" deben actualizarse regularmente porque representa el deviseio en vivo que otros clientes pueden comprar.

Necesito usar la reference a "matriz" en otras classs en diferentes momentos durante la vida útil de la aplicación. No quiero llamar al server cada vez que quiero usar o actualizar "array". Al probar esta aplicación en mi propio dispositivo, parece que llamar al server puede ser lento -> duele el performance de la aplicación.

He considerado la creación de una class que podría actuar como un delegado para mantener una reference a un NSArray, tipo de actuación como una variable global. Haría una request asíncrona al server y seguiría con la respuesta en esta class de delegado. No estoy seguro de cómo determinar si este enfoque es eficiente o considera las mejores prácticas (teniendo en mente a MVC).

Estoy buscando encontrar el mejor lugar para almacenar "array" para que otras classs lo puedan usar rápidamente sin depender demasiado de la networking o del uso de memory. "array" debe poder actualizarse ocasionalmente desde el server (ya que el "model" puede cambiar de los cambios de deviseio). Según mi investigación, CoreData de iOS parece ser el mejor lugar para comenzar, pero no estoy seguro de cómo actualizar CoreData regularmente si la aplicación no está activa. En otras palabras, no deseo presentar al usuario datos obsoletos si los datos en CoreData no se han actualizado recientemente.

Las respuestas json son de aproximadamente 20KB – 45KB.

¿Dónde está el mejor / lugar alternativo para almacenar objects ligeros para que puedan actualizarse regularmente? Me inclino hacia la variable de estilo de session, pero no sé si hay una mejor manera de hacerlo.

Para ver esto de acuerdo con MVC, tiene dos partes:

  • Una matriz: este es el model
  • El código que obtiene el deviseio del server: este es el controller

Este código del controller es realmente el controller de model, no el controller de vista. No lo pondría en una class de controller de vista. Podría ponerlo en su delegado de la aplicación si el código es muy simple, pero recomendaría ponerlo completamente en su propia class.

In- applicationDidFinishLaunching :

[[InventoryController shanetworkingInstance] reloadContent]; [[InventoryController shanetworkingInstance] scheduleUpdates]; 

InventoryController.h

 @interface InventoryController @property (retain) NSArray *inventory; @property (retain) NSTimer *reloadTimer; + (InventoryController *) shanetworkingInstance; - (void) reloadContent; - (void) scheduleUpdates; @end 

InventoryController.m

 @implmentation InventoryController - (void) reloadContent { ... } + (InventoryController *) shanetworkingInstance { static InventoryController * singleton; if (!singleton) singleton = [[self.class alloc] init]; return singleton; } - (void) scheduleUpdates { self.reloadTimer = ...; } @end 

En todos lados:

 NSArray *inventory = [[InventoryController shanetworkingInstance] inventory]; 

En -reloadContent , debe extraer el contenido del server. En -scheduleUpdates , debe configurar un timer que actúe en el controller, haciendo que vuelva a cargar datos periódicamente. Si el controller de vista necesita ajustar su comportamiento cuando los datos están obsoletos, almacene un NSDate junto con el array, agregue un método como -isStale que comtesting las dates e invoca primero.

Recuerde cargar las URL en segundo plano. No debe detener y volver a cargar datos mientras maneja un evento o acción, por lo que, en esencia, su controller de vista debe regresar del método de acción mientras espera datos y ajustar su visualización cuando recupere los datos.

Si un controller de vista necesita responder una vez que se actualizan los datos, haga que los controlleres de vista se registren para recibir una notificación que puede publicar cuando su controller de deviseio termine de actualizar su contenido:

  [[NSNotificationCenter defaultCenter] postNotificationName:InventoryControllerDidReloadContent object:self]; 

Si desea almacenar en caching los datos de deviseio en el dispositivo para que pueda eliminarlo de la memory cuando la aplicación quede en segundo plano, puede hacerlo escribiendo la matriz en una list de properties, pero si los datos obsoletos no son útiles, es posible que no quiero molestar

Puede usar Core Data en lugar de la matriz y la list de properties, pero no elimina la necesidad de un controller que cargue los datos del server y los cargue en el context. En lugar de tener una matriz, es probable que tenga un context de object administrado y un controller de resultados extraído. Si no estás editando ese contenido en tu aplicación, dudo que Core Data proporcione algún beneficio sobre una matriz y una list de properties.

Recomiendo almacenar esto en su delegado de la aplicación. Funciona bien para almacenar una matriz y se puede acceder desde cualquier class en su aplicación.

Si esta "matriz" tiene una estructura interesante CoreData es una buena elección. En este caso, supongo que CoreData y un plist van a ser tan rápidos como el uno del otro. Use lo que parezca más simple y si es demasiado lento pruebe el otro.

Intenta no necesitar actualizar los datos mientras la aplicación no se está ejecutando. Almacene la última hora de actualización con sus datos almacenados en caching. Si es "demasiado viejo" muestre un marcador de position "por favor espere" y actualícelo. Si es "viejo pero no demasiado viejo" muestre lo que tiene y actualícelo en un hilo no principal. O pruebe con otras variantes de esa interfaz de usuario ("demasiado antiguo" == notificación + modo de solo lectura).

Si encuentra un truco para actualizar en segundo plano que pasa la revisión de la aplicación, piense largo y tendido sobre qué cantidad de la batería de su usuario se comerá. Añade una forma de desactivarlo. O desactívelo de forma pnetworkingeterminada y agregue una forma de habilitarlo. O simplemente no lo hagas. Todos los derechos reservados