2012-05-07 14 views
5

He implementado la siguiente NSOperation, dibujar N vistas personalizadasNSOperation: addSubview en el hilo principal y lentitud

- (void)main { 

    for (int i=0; i<N; i++) { 

     << Alloc and configure customView #i >> 
     //(customView is a UIView with some drawing code in drawrect) 

     [delegate.view addSubview:customView]; 

    } 

    NSLog(@"Operation completed"); 
} 

en el método drawRect del CustomView tengo

- (void)drawRect { 

    <<Drawing code>> 

    NSLog(@"Drawed"); 
    delegate.drawedViews++; 

    if (delegate.drawedViews==VIEWS_NUMBER) { 
     [delegate allViewsDrawn]; 
    } 
} 

Así que el delegado recibe la notificación cuando se dibujan todas las vistas.

El problema es que después del registro "Operación completada" transcurren aproximadamente 5 segundos antes de que pueda ver el primer registro "Dibujado".

¿Por qué sucede esto? Y en términos generales, ¿cómo debo comportarme para saber qué línea de código está tardando tanto tiempo en ejecutarse?

------ ------ EDITAR

veces (como 1 de cada 10 veces) que estaba recibiendo choques que hacen esto, porque no hay que llamar addsubview del NSOperation, ya no es un hilo seguro. Así que cambió a

[delegate.view performSelectorOnMainThread:@selector(addSubview:) withObject:customView waitUntilDone:NO]; 

Ahora no tengo los accidentes más, pero el proceso toma un tiempo muy largo para ser ejecutado! Como 5 veces más que antes.

¿Por qué es tan lento?

Respuesta

5

para que todo funcione correctamente, necesitamos olvidarnos de NSOperation y utilizar este "truco"

dispatch_queue_t main_queue = dispatch_get_main_queue(); 
dispatch_async(main_queue, ^{ 

    [self createCustomViews]; 

    dispatch_async(main_queue, ^{ 

     [self addAnotherCustomViewToView]; 

    }); 
}); 
+0

Hola! Pregunta para usted: ¿Por qué es necesario el dispatch_async anidado? (Confío en que lo haya escrito de esa manera por una razón. Todavía no lo estoy viendo) ¡Gracias! –

+0

Para ser sincero, encontré este código, y simplemente funciona. Realmente no sé más que esto :-) – Abramodj

+0

¡OK, entonces! (Ahora estoy en una misión - jeje.) Gracias por publicarlo. :) –

Cuestiones relacionadas