Pregunta

¿Hay alguna manera al enviar este mensaje para especificar que preferiría tener mi selector realizada después de todos los eventos de interfaz de usuario pendientes, si las hay? Es decir. dar mi aterDelay temporizador de menor prioridad en la cola de eventos.

¿Fue útil?

Solución

No directamente. Si utiliza performSelector:withObject:afterDelay: el selector se realiza en el hilo principal , por lo que, por definición, se producirá después de todos los "pendientes" eventos de interfaz de usuario actuales se han realizado, pero esto podría ser en el medio de un rollo o animación, que es probable que considero que es un evento continuo, pero es en realidad cientos de juegos independientes.

Sin embargo, se puede lograr algo similar con performSelectorInBackground:withObject:, y luego llamar a [NSThread setThreadPriority:0.01] en el método que se llama. Tenga cuidado, estás abriendo un subproceso en segundo plano, por lo que no se puede hacer ninguna llamada de interfaz de usuario. Sin embargo, esto le permitirá hacer el trabajo de un hilo de fondo con menor prioridad que el hilo principal interfaz de usuario. (Recuerde que debe configurar una piscina autorelease ya que es en su propio hilo!)

Otros consejos

En realidad, performSelector:withObject:afterDelay: no necesariamente tiene que ocurrir en el hilo principal; es por eso que hay un método separado performSelectorOnMainThread:withObject:waitUntilDone:. La documentación para +[NSThread detachNewThreadSelector:toTarget:withObject:] dice

  

invoca un método del receptor en el actual hilo usando el modo por defecto después de un retardo.

Si desea realizar una tarea en segundo plano, se puede intentar <=>, que pondrá en marcha un nuevo hilo para realizar su tarea y salir de la interfaz de usuario sensible. El uso de un hilo separado para ejecutar una tarea de larga duración, que de otro modo podrían encerrar a su interfaz de usuario es generalmente una buena idea, pero añade complejidad. Si no está familiarizado con rosca, que puede terminar con los insectos que no tiene ningún sentido.

En un comentario anterior, usted ha mencionado que usted piensa que la animación puede ser culpable por hacer que la interfaz de usuario no responde. Si está utilizando el soporte incorporado para la animación (Animación Core o una de las envolturas de cacao), la animación no debe hacer que su interfaz de usuario no responde. Una interfaz de usuario no responde por lo general significa que su programa está haciendo mucho trabajo en el hilo principal antes de permitir que el bucle de ejecución volver a los eventos de interfaz de usuario de servicio.

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