2012-06-20 20 views
16

Sé que UIView no es seguro para subprocesos, así que no puedo agregar una vista en un hilo de fondo, para evitar esto ¿está bien crear un UIView en un hilo de fondo y luego agregarlo en el hilo principal?¿Está bien crear una UIView en una cadena de fondo?

Nota: la razón por la que no estoy haciendo 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 llenar los valores. No quiero que la interfaz de usuario deje de responder cuando lo hago, así que estoy tratando de evitar 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 de antemano.

+0

Creo que lo tienes correcto. Créelo en el fondo, pero actualice la interfaz de usuario en el principal. –

Respuesta

15

De UIView:

Consideraciones de roscado

Manipulaciones a debe ocurrir en el hilo principal interfaz de usuario de la aplicación. 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. El único momento en que esto puede no ser estrictamente necesario es cuando se crea el objeto de vista en sí, pero todas las demás manipulaciones deben ocurrir en el hilo principal.

La llamada a initWithFrame: explícitamente no es segura para subprocesos. Es probable que la llamada al setText: no sea segura para subprocesos y caiga dentro de la cláusula de "manipulaciones". Ciertamente, no se promete que serán seguros para subprocesos.

Haga su trabajo para descifrar los datos en un hilo de fondo. Luego crea tus vistas 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 UI permanezca receptiva; No he experimentado extensivamente con eso.

También es posible que desee considerar cambiar de UIView a CALayer donde sea posible. La mayoría de los trabajos de CALayer se pueden realizar en hilos 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 de Modelo y Vista. Las clases de modelo deben calcular todo lo necesario independientemente de la creación de las vistas.

+5

Lo siento, pero podría aclarar su respuesta ? La cita de Apple específicamente dice que crear una vista en el fondo está bien, pero estás diciendo que no. ¿Por qué? –

+0

@iamataptool probablemente puedas crear UIView de forma segura con el método 'init' pero no con el método' initWithFrame: ' – DanSkeel

+0

El consejo de CALayer hizo que mi día y semana. ¡Muchas gracias! –

0

Los Drawing and Printing Guide estados:

Importante Las clases UIKit por lo general no seguro 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 "operaciones relacionadas con el dibujo". Si suponemos que una clase correcta solo ejecuta dicha operación en su método drawRect:, entonces el enfoque que sugiera debería estar bien.

+0

En mi caso, mi aplicación se activa a través de 'UIApplicationLaunchOptionsLocalNotificationKey', por lo que está en segundo plano. ¿Está bien, si realizo adiciones de subvista cuando la aplicación está en segundo plano? https://stackoverflow.com/questions/46584566/how-to-stop-handle-ui-operations-in-ios-when-app-moves-to-background-state – Nil

3

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

[UView init] debe llamarse a partir de hilos principal solamente

Así que creo que se debe crear la interfaz de usuario en el hilo principal mejor

Muestra la imagen siguiente:

enter image description here

Cuestiones relacionadas