estoy dibujando fuera de la pantalla a un CGContext
creada usando CGBitmapContextCreate
, luego generar una CGImage
de ella con CGBitmapContextCreateImage
y el dibujo que en mi punto de vista en drawRect
(También estoy dibujando algunas otras cosas además de eso - se trata de un ejercicio de aislar diferentes niveles de variabilidad y complejidad).Usando Core Graphics/Cocoa, ¿puedes dibujar en un contexto de mapa de bits desde un hilo de fondo?
Todo funciona bien cuando todo se ejecuta en el hilo principal. Sin embargo, una de las motivaciones para dividir esto de esta manera fue que la parte fuera de pantalla se podía ejecutar en un hilo de fondo (lo que pensé que debería estar bien ya que no se está renderizando en un contexto en pantalla).
Sin embargo, cuando lo hago, ¡la imagen resultante está vacía! Revisé el código y coloqué juiciosamente NSLog para verificar que todo esté sucediendo en el orden correcto.
Mi próximo paso es reducir esto al código más simple que reproduce el problema (o encontrar algo tonto que me falta y arreglarlo) - en ese punto tendría algún código para publicar aquí si es necesario. Pero primero quería comprobar aquí que no voy por el camino equivocado con esto. No pude encontrar nada en mis viajes alrededor de la esfera de hielo que arroje luz en ambos sentidos, pero un amigo mencionó que se encontró con un problema similar al intentar cambiar el tamaño de las imágenes en un hilo de fondo, sugiriendo que puede haber alguna limitación general aquí.
[editar]
Gracias por las respuestas hasta el momento. Si nada más me han dicho que al menos no estoy solo porque no tengo una respuesta para esto, que era parte de lo que quería averiguar. En este punto, voy a poner el trabajo extra para obtener el ejemplo más simple posible y puedo regresar con algún código o más información. Mientras tanto, guarde las ideas siguientes :-)
Un punto a tener en cuenta: un par de personas han usado el término thread safety con respecto a las API. Debe tenerse en cuenta que hay dos tipos de hilo de seguridad en este contexto:
- Threadability de la API de sí mismo - es decir, ¿Se puede utilizar en absoluto de más de un hilo (estado global y otros problemas de re-entrada tales como strtok de C son razones comunes por las que una API podría no ser segura también para subprocesos).
- Atomicidad de operaciones individuales: ¿pueden interactuar varios subprocesos con los mismos objetos y recursos a través de API sin bloqueo de nivel de aplicación?
Sospecho que mencionar hasta ahora ha sido del primer tipo, pero agradecería si pudiera aclarar.
[Edit2 - solucionado]
Ok, lo tengo todo el funcionamiento. El resumen ejecutivo es que el problema estaba conmigo, en lugar de los contextos de los mapas de bits.
En mi hilo de fondo, justo antes de dibujar en el contexto del mapa de bits, estaba preparando algunos otros objetos. Resulta que, indirectamente, las llamadas a esos otros objetos llevan a llamar a setNeedsDisplay en algunas vistas. Al separar la parte que hizo eso del hilo principal, ahora todo funciona perfectamente.
Así que para cualquiera que se meta en esta pregunta preguntándose si pueden dibujar en un contexto de mapa de bits en un hilo de fondo, la respuesta es que puede (con las advertencias que se han presentado aquí y en las respuestas).
Gracias a todos
Su descripción detallada de su problema y solución me ayudó a descubrir qué problema tenía mi propio código. ¡Muchas gracias! – Kalle