objective-c ios uiview uiviewcontroller nsthread

objective c - ¿Es correcto crear un UIView en un hilo de fondo?



objective-c ios (3)

Desde UIView :

Consideraciones de roscado

Las manipulaciones a la interfaz de usuario de su aplicación deben ocurrir en el hilo principal. Por lo tanto, siempre debe llamar a los métodos de la clase UIView desde el código que se ejecuta en el hilo principal de su aplicación. La única vez que esto puede no ser estrictamente necesario es cuando se crea el objeto de vista en sí, pero todas las otras manipulaciones deben ocurrir en el hilo principal.

La llamada a initWithFrame: explícitamente no es segura para subprocesos. La llamada a setText: probablemente no sea segura para subprocesos, ya que está incluida en la cláusula de "manipulaciones". Ciertamente, estos no se prometen ser seguros para los hilos.

Haga su trabajo para averiguar los datos en un hilo de fondo. Luego crea tus puntos de vista en el hilo principal. Si hay una gran cantidad de vistas, puede intentar dividir el trabajo utilizando varias llamadas dispatch_async() en la cola principal. Esto puede permitir que la interfaz de usuario permanezca receptiva; No he experimentado mucho con él.

También puede considerar cambiar de UIView a CALayer siempre que sea posible. La CALayer trabajo de CALayer se puede hacer en subprocesos de fondo. Si tiene una gran cantidad de vistas, probablemente sea ineficiente de todos modos. Si es solo que lleva mucho tiempo calcular los datos para las vistas, eso sugiere que no está separando correctamente la información del Modelo y la Vista. Las clases de modelo deben calcular todo lo necesario independientemente de la creación de las vistas.

Sé que UIView no es seguro para subprocesos, así que no puedo agregar una vista en un subproceso en segundo plano, para solucionar esto, ¿está bien crear una UIView en un subproceso en segundo plano y luego agregarlo en el subproceso principal?

Nota: la razón por la que no hago esto en el hilo principal es porque mi código real es mucho más complejo y, por lo tanto, toma un tiempo crear todas las vistas y completar los valores. No quiero que la interfaz de usuario deje de responder cuando hago esto, así que estoy intentando solucionar esto.

por ejemplo..

-(void)addLabel//called on background thread { UILabel * label = [[UILabel alloc]initWithFrame:CGRectMake(0,0,40,100)]; [label setText:@"example"] [self.view performSelector:@selector(addSubview:) onThread:[NSThread mainThread] withObject:example waitUntilDone:YES]; }

Gracias por adelantado.


La Guía de Dibujo e Impresión establece:

Importante Las clases UIKit generalmente no son seguras para subprocesos. Todas las operaciones relacionadas con el dibujo deben realizarse en el hilo principal de su aplicación.

Por lo tanto, según entiendo esto, parece que el único problema está relacionado con las "operaciones relacionadas con el dibujo". Si asumimos que una clase correcta solo ejecuta dicha operación en su método drawRect: entonces el enfoque que sugiera debería estar bien.


Yo uso Xcode Versión 9.0 beta 3 (9M174d), recibiendo una advertencia.

[UView init] debe ser llamado desde el hilo principal solamente

Así que creo que deberías crear una interfaz de usuario mejor en el hilo principal

Mostrar la imagen de abajo: