Uso del sueño dentro de las aplicaciones de iPhone (especialmente con UINavigationController)

StackOverflow https://stackoverflow.com/questions/1042479

Pregunta

Soy bastante nuevo en el desarrollo de iPhone, pero estoy cerca de lanzar mi primera aplicación (relacionada con un sitio web que ejecuto). La aplicación requiere una base de datos muy grande y, como tal, he decidido almacenar solo los datos más utilizados localmente, recuperando los otros datos a través de una llamada de servicio web JSON desde la base de datos de mi sitio web.

Mientras realizaba bien el uso del simulador (golpear la base de datos en vivo), las búsquedas que se basaban en la llamada al servicio web han tardado más de lo que esperaba cuando se ejecutaran en el teléfono. Estas llamadas se ven mucho peor en comparación con las búsquedas nativas que son instantáneas. Para reducir la diferencia relativa, quería poner un intersticial falso (página con indicador de actividad) para las búsquedas nativas (las búsquedas del servicio web ya usan una), pero he tenido un problema con la sincronización de los impulsos del controlador de navegación cuando se combina con dormir (n)

De todos modos, la sección de búsqueda de mi aplicación es un NavController dentro de una pestaña tabController. Cuando intente usar un código como este:

[[tabBarController.viewControllers objectAtIndex:0] pushViewController:(UIViewController *)waitingController animated:YES];
sleep(2);

Encuentro que el impulso siempre espera a que termine el sueño antes de ejecutar cuando el efecto que quiero es que se presione el controlador de vista y luego la aplicación espere dos segundos antes de continuar simulando el proceso de búsqueda.

He tenido algunos resultados extraños con los empujes de NavController, en algunas ocasiones he experimentado lo que parece ser una combinación de dos controladores de vista separados cuando el que he presionado como intersticial permanece en su lugar solo con respecto al contenido el título del que quiero insertar en su lugar restante.

Estoy seguro de que hay una falta fundamental de comprensión de mi parte, así que espero un poco de orientación aquí.

Saludos,

Alan.

¿Fue útil?

Solución

sleep (float) bloquea el hilo principal haciendo que la IU se congele. En su lugar, debe programar alguna acción para que se realice más tarde usando - [NSObject performSelector: withObject: afterDelay:]

Ejemplo:

[label performSelector:@selector(setText:) withObject:@"Delayed Hello World!" afterDelay:2.0f];

Otros consejos

Me gustaría cambiar la arquitectura y no dormir en el hilo principal, ¡no es una gran experiencia de usuario!

Considere el uso de NSOperation para controlar sus interacciones con el servicio web; esto le permitirá poner en cola las operaciones y hacer que se ejecuten en una secuencia específica o en paralelo.

NSOperation es una forma muy fácil de proporcionar operaciones de subprocesos robustas, y puede optar por devolver la llamada al subproceso principal con las actualizaciones que desee realizar en el camino.

Creo que esta arquitectura lo ayudará a mejorar la interfaz de usuario, pero una vez que haya reconfigurado su pensamiento para usar las operaciones, encontrará muchos otros beneficios.

NB: Me tomó varias veces comprender realmente NSOperation y NSOperationQueue, pero el tiempo que invertí definitivamente valió la pena.

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