2012-07-06 24 views
7

sé que es seguro para dibujar sobre cualquier tema, siempre que llamo¿Es seguro este hilo del código de Core Graphics?

UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0); 
UIGraphicsEndImageContext(); 

en el mismo hilo.

Tomar una captura de pantalla de una vista mediante este método lleva unos 300 ms, lo cual no está nada mal, pero estoy en una situación difícil, así que quiero hacerlo en un hilo de fondo.

Esto es lo que estoy haciendo:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0); 
     [view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
     UIImage * screenshot = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 
    }); 

La única cosa aquí en cuestión es el view, que se encuentra en el hilo principal. ¿Es seguro llamar al renderInContext en un view.layer desde un hilo de fondo? O, en general, ¿es seguro leer solo un objeto UIKit de otro hilo?

(Y no me proporcione la respuesta "UIKit is not thread safe" predeterminada. Ya lo sé. Este es un caso especial (y no me digan que no hay casos especiales).)

(el código anterior funciona bien, pero no estoy seguro si eso es sólo una coincidencia.)

+0

No creo que obtenga una respuesta definitiva a esta pregunta porque en ninguna parte de la documentación Apple declarará nada que no sea 'UIKit is not thread safe' (junto con las excepciones enumeradas). Lo que obtendrás son opiniones y experiencias de otras personas, pero como dijiste, el código anterior funciona bien, pero ¿quién puede decir que siempre lo hará e incluso si alguien más te dice que lo hará, o sí? – Rog

+0

¿Las reglas de enhebrado se aplican a la modificación o lectura de un objeto también? – Snowman

+0

¿Y si hago una copia de la vista antes, de modo que estoy seguro de que este método sería el único que tendría acceso a esta nueva copia? – Snowman

Respuesta

7

Graphics Core y Core Animation siendo las API de bajo nivel, son generalmente hilo de seguridad. Sin embargo, las mismas reglas sobre el acceso siguen siendo válidas: no se debe acceder a ningún trabajo por más de un hilo al mismo tiempo, de lo contrario, el dibujo fallará y tu aplicación se bloqueará. Sería cauteloso (pero no con miedo) de UIImage, ya que los objetos UIKit no solo no son seguros para hilos, básicamente están marcando bombas de tiempo en hilos de fondo, y felizmente saltaré de un acantilado a Exception Land sin ninguna buena razón. Sin embargo, dado que UIImage es solo un contenedor CGImage, una vez más, la mayoría de los dibujos son seguros para la ejecución de subprocesos.

+0

Entonces, ¿hay una alternativa inteligente para tomar una captura de pantalla en segundo plano? ¿Qué hay de usar NSData en el hilo bg, y usar eso para construir una imagen en el hilo principal? – Snowman

+0

¿Capturas de pantalla en segundo plano? No es posible sin IOSurface, que ahora Apple es bastante consciente de gracias a Display Recorder, sin embargo, si eso no importa, ver [aquí] (http://stackoverflow.com/questions/11090184/how-does-the- ios-app-display-recorder-record-the-screen-without-using-private-ap /). – CodaFi

+0

No en el fondo de fondo - hilo de fondo Quiero decir .. – Snowman

Cuestiones relacionadas