2012-05-07 14 views
5

Ho implementato il seguente NSOperation, disegnare N visualizzazioni personalizzateNSOperation: addSubview nel thread principale e la lentezza

- (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"); 
} 

nel metodo drawRect del CustomView ho

- (void)drawRect { 

    <<Drawing code>> 

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

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

Così il delegato ricevere la notifica quando tutte le viste sono disegnate.

Il problema è che dopo il log "Operazione completata" ci vogliono circa 5 secondi prima di poter vedere il primo log "Disegnato".

Perché sta succedendo? E in generale, come dovrei comportarmi per scoprire quale linea di codice impiega così tanto tempo a essere eseguita?

------ ------ EDIT

A volte (come 1 su 10 volte) mi è stato sempre crash fare questo, perché non si deve dire addsubview dal NSOperation, dal momento che non è un thread sicuro. Così ho cambiato in

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

Ora non ho più crash, ma il processo richiede molto tempo per essere eseguito! Come 5 volte di più di prima.

Perché è così lento?

risposta

5

Per rendere le cose funzionano correttamente abbiamo bisogno di dimenticare NSOperation e utilizzare questo "trucco"

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

    [self createCustomViews]; 

    dispatch_async(main_queue, ^{ 

     [self addAnotherCustomViewToView]; 

    }); 
}); 
+0

Hi! Domanda per te: perché è necessario dispatch_async nidificato? (Confido che tu l'abbia scritto in quel modo per una ragione: non lo vedo ancora.) Grazie! –

+0

Ad essere sincero, ho trovato questo codice in giro e funziona. Non ne so molto più di questo :-) – Abramodj

+0

OK allora! (Ora sono in missione - hehe.) Grazie per averlo pubblicato. :) –

Problemi correlati