UIViewController viewDidLoad vs. viewWillAppear: ¿Cuál es la división del trabajo adecuada?

Siempre he estado un poco confuso sobre el tipo de tareas que deberían asignarse a viewDidLoad vs. viewWillAppear : en una subclase UIViewController .

por ejemplo, estoy haciendo una aplicación donde tengo una subclase UIViewController golpeando un servidor, obteniendo datos, alimentándolo a una vista y luego mostrando esa vista. ¿Cuáles son los pros y los contras de hacer esto en viewDidLoad vs. viewWillAppear ?

viewDidLoad es cosas que tienes que hacer una vez. viewWillAppear se llama cada vez que aparece la vista. Debería hacer cosas que solo tiene que hacer una vez en viewDidLoad, como configurar sus textos UILabel. Sin embargo, es posible que desee modificar una parte específica de la vista cada vez que el usuario la vea, por ejemplo, la aplicación iPod desplaza la letra hacia la parte superior cada vez que va a la vista “Reproducción en curso”.

Sin embargo, cuando cargas cosas desde un servidor, también debes pensar en la latencia. Si empaqueta todas sus comunicaciones de red en viewDidLoad o viewWillAppear, se ejecutarán antes de que el usuario vea la vista, lo que podría resultar en una congelación corta de su aplicación. Puede ser una buena idea mostrar primero al usuario una vista despoblada con un indicador de actividad de algún tipo. Cuando haya terminado con su red, que puede tomar uno o dos segundos (o incluso puede fallar, ¿quién sabe?), Puede completar la vista con sus datos. Buenos ejemplos de cómo se puede hacer esto se pueden ver en varios clientes de Twitter. Por ejemplo, cuando ve la página de detalles del autor en Twitterrific, la vista solo dice “Cargando …” hasta que las consultas de la red se hayan completado.

Inicialmente solo se usó ViewDidLoad con tableView. En las pruebas con pérdida de Wifi, al configurar el dispositivo en modo avión, se dio cuenta de que la tabla no se actualizaba con el retorno de Wifi. De hecho, parece que no hay forma de actualizar TableView en el dispositivo incluso pulsando el botón de inicio con el modo de fondo establecido en SÍ en -Info.plist.

Mi solución:

 -(void) viewWillAppear: (BOOL) animated { [self.tableView reloadData];} 

Es importante tener en cuenta que usar viewDidLoad para el posicionamiento es un poco arriesgado y debe evitarse ya que los límites no están establecidos. esto puede causar resultados inesperados (tuve una variedad de problemas …)

Esta publicación describe bastante bien los diferentes métodos y lo que sucede en cada uno de ellos.

Actualmente, para iniciar y posicionar una vez, estoy pensando en utilizar viewDidAppear con una bandera, si alguien tiene alguna otra recomendación, por favor avíseme.

Depende, ¿Necesita que los datos se carguen cada vez que abra la vista? o solo una vez ?

enter image description here

  • Rojo: no requieren cambiar todo el tiempo. Una vez que están cargados se quedan como estaban.
  • Púrpura: necesitan cambiar con el tiempo o después de cargar cada vez. No desea ver a los mismos 3 usuarios sugeridos a seguir, necesita volver a cargar cada vez que regrese a la pantalla. Sus fotos pueden actualizarse … no quieres ver una foto de hace 5 años …

viewDidLoad: cualquier procesamiento que tengas que hacer una vez.
viewWilLAppear: Cualquier procesamiento que deba cambiar cada vez que se cargue la página.

Las tags, los icons, los títulos de los botones o la mayoría de los datosInputedByDeveloper por lo general no cambian. Los nombres, las fotos, los enlaces, el estado de los botones, las listas (matrices de entrada para sus tableViews o collectionView) o la mayoría de los dataInputedByUser generalmente cambian.