2011-12-16 11 views
6

He escrito una pequeña definen llamada ensureInMainThread (y lo uso un poco). Sin embargo, no estoy seguro exactamente qué métodos de interfaz de usuario requieren siendo llamados en el hilo principal. ¿Qué hay de setNeedsDisplay y setNeedsLayout? ¿Cuál es la regla de oro para los métodos que deben invocarse en el hilo principal en iOS 5.x?¿Qué necesita estar en el hilo principal?

Estas preguntas están relacionadas (algunas preguntas de baja calidad y respuestas, y algunos muy caso específico), pero me gustaría una solución amplia, única buena respuesta:

Respuesta

9

A partir de iOS 4.0, some user interface updates can be performed on a background thread:

  • dibujo a un contexto gráfico en UIKit es ahora thread-safe. Específicamente:

    • Las rutinas para acceder y manipular el contexto gráfico ahora puede manejar correctamente contextos que residen en diferentes hilos.

    • cadena y el dibujo de imagen es ahora seguro para subprocesos.

    • Uso del color y objetos de fuente en múltiples hilos es ahora seguro hacerlo.

David Duncan lo confirma en sus comentarios here.

Más allá de eso, casi todo lo demás en cuanto UIKit no se considera multi-hilo, por lo que debe asegurarse de que está interactuando con él en el hilo principal en esos casos.

Como un lado, prefiero my block-based implementation of a "always run on the main thread" function sobre la macro a la que se vincula, porque me gusta el ajuste explícito de código que debe ejecutarse en el hilo principal.

+0

Bravo, como siempre +1, gracias Brad Larson. Esta es la respuesta que estaba buscando (sin haber podido imaginarlo). ¿Podría comentar sobre 'setNeedsDisplay' y' setNeedsLayout', y si puede ajustar una cadena en un 'UILabel' con seguridad desde otro hilo? –

+1

@Yar - Creo que '-setNeedsDisplay' es seguro, debido a las protecciones en torno a dibujar en un contexto, pero no estoy seguro de' -setNeedsLayout'. Creo que esto último puede no ser seguro, porque no se trata de dibujar, sino de posicionar vistas y capas. Creo que el dibujo de texto de UILabel debería ser seguro, pero no lo he probado yo mismo. –

3

Regla de pulgar: Cualquier cosa que actualice la interfaz mu st estar en el hilo principal.

+3

Como señalo en mi respuesta, ahora hay algunos aspectos de UIKit que son multi-hilo a partir de iOS 4.0. –

Cuestiones relacionadas