Pregunta

Estoy creando una aplicación para el iPhone bastante compleja usando datos básicos. Hasta ahora, las cosas han estado trabajando bien. A medida que la aplicación ha sido cada vez más complejo, sin embargo, un nuevo problema ha surgido: el primer controlador de vista está terminando su método viewDidLoad antes de la AppDelegate pone aún a mitad de camino a través de su método de applicationDidFinishLaunching.

El controlador de vista no es la raíz, que es un controlador de barra de pestañas. El VC en cuestión es el de la pestaña por defecto seleccionado en la barra de pestañas. Es cada vez instanciado por IB.

No hay nada como esto ha ocurrido antes en mi experiencia, y está arrojando la inicialización importante que estoy haciendo en los AppDelegate (que consiguen los objetos de la base de datos y prepararlos para su uso). Por otra parte, es intermitente - a veces el delegado hace meta en primer lugar.

Alguien más ha notado una dificultad como este? Cualquier código de ejemplo que se ocupa de un tema tan?

supongo que la respuesta es hacer que el VC cargar los datos que el AppDelegate se prepara sólo cuando el AppDelegate envía un mensaje de que está listo. Estoy un poco preocupado de que esta es la adición de algo que acaba de terminar me muerde en el trasero más adelante.

¿Fue útil?

Solución

La solución que estoy usando para evitar condiciones de carrera como esta es renunciar por completo hace referencia a cualquiera de la interfaz de usuario funcional de la aplicación hasta que los datos se ha cargado y validado. En la parte superior de mi -applicationDidFinishLaunching: método, hago lo siguiente:

  1. Crea un UIWindow con una vista secundaria:
    • a UIImageView de Default.png con una vista secundaria:
      • a UIActivityIndicatorView centrada en el marco (y animación)
  2. Establecer clave de ventana y visible para el usuario obtiene una retroalimentación visual tan pronto como sea posible que algunos crujido de datos está pasando antes de que las cargas de interfaz de usuario.
  3. Haga todo su carga de datos y validación (que podría incluir la actividad de la red)
  4. Crear y agregar vista principal de la interfaz de usuario de la ventana como un subvista justo debajo de la vista Default.png, que luego se desvaneció y se retira de su supervista.

¿Cómo se implementa el paso 4 (llamada a subrutina, notificación asíncrona, clave-valor observación, etc ...) es totalmente de usted. Lo que es importante es la idea de hacer la carga de cualquier componentes de interfaz depende de la carga de los componentes de datos requeridos.

Esto le permite escribir todo el código de interfaz de usuario sin tener que preocuparse acerca de los datos, que es lo que quieren hacer en una aplicación MVC de todos modos.

Otros consejos

Una vez finalizada la inicialización aplicación delegado, despedir a un NSNotification - esto sería lo último que el método applicationDidFinishLaunching va a hacer, es de suponer.

Tienen el mismo delegado de la aplicación para escuchar que la notificación y el fuego de un selector, por ejemplo loadViewController, que a su vez carga el controlador de vista.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top