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?
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! –
Ad essere sincero, ho trovato questo codice in giro e funziona. Non ne so molto più di questo :-) – Abramodj
OK allora! (Ora sono in missione - hehe.) Grazie per averlo pubblicato. :) –