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.)
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
¿Las reglas de enhebrado se aplican a la modificación o lectura de un objeto también? – Snowman
¿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