2012-05-04 17 views
5

Voglio solo prerenderare immagini diverse per un accesso veloce. Uso qui il grand central dispatch per eseguire i diversi blocchi.Grand Central Dispatch: mostra la prima immagine quando viene caricata?

Dopo aver avviato la coda, desidero impostare la prima immagine al termine. Con il codice corrente sotto, sfortunatamente la prima immagine verrà visualizzata solo quando tutte le immagini sono state renderizzate.

Quindi, come posso modificare il codice? È possibile ottenere un delegato al termine di ogni immagine?

Here's il codice:

// Async prerendering 
    for (int i = 0; i < count; i++) { 

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ 

      dispatch_async(dispatch_get_main_queue(), ^{ 

       UIImage* finalImage = [self prerenderImageForIndex:i]; 
       [self.imageArray addObject:finalImage]; 

       // TODO: i want to display the first image. 
       // rendering goes on in the background 

       if (i==0 && [self.imageArray objectAtIndex:0] != nil) { 
        self.image = [self.imageArray objectAtIndex:0]; 
       } 
      }); 
     }); 
    } 

Aggiornamento:

-(UIImage*) prerenderImageForIndex:(int)frame { 
UIGraphicsBeginImageContextWithOptions(CGSizeMake(self.frame.size.width, self.frame.size.height), NO, 0);  

     for (int i=0; i< [configurationArray count]; i++) {  
     //... get the layerName 

     UIImage* layerImage = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:layerName ofType:@"png"]]; 

       // draw layer with blendmode and alpha 
     [layerImage drawInRect:CGRectMake(x, y, layerImage.size.width, layerImage.size.height) 
        blendMode:layerblendmode 
         alpha: layeralpha]; 

      } 

    // Get current context as an UIImage 
    UIImage* finalImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

return finalImage; 

} 

voglio solo sapere come faccio a cancellare/arrestare o riavviare una coda di esecuzione? È possibile? Grazie per il vostro aiuto.

risposta

2

è necessario utilizzare una coda di serie, che esegue FIFO per esempio:

dispatch_queue_t queue; 
queue = dispatch_queue_create("myImageQueue", NULL); 
for(int i = 0; i<count; i++) { 
    dispatch_async(queue, ^{ 
     // do your stuff in the right order 
    }); 
} 

per le code per spedizione di serie un'occhiata a: http://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html

+0

Sì, questo risolve il problema! Grazie mille. Assegno il "self.image" all'interno di "dispatch_async (queue,^{". Ora funziona perfettamente! Tuttavia darò un'occhiata alla documentazione al riguardo. Grazie ancora. – geforce

2

Non sono sicuro del motivo per cui le chiamate di dispatch_async sono nidificate come questa, ma forse questo è il problema. Immagino che qualcosa come sotto possa realizzare ciò che vuoi. Hai solo bisogno di ottenere la coda principale quando in realtà vuoi fare l'aggiornamento dell'interfaccia utente, tutto il resto dovrebbe essere fatto sulla coda di sfondo.

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ 

    UIImage* finalImage = [self prerenderImageForIndex:i]; 
    [self.imageArray addObject:finalImage]; 

    if (i==0 && [self.imageArray objectAtIndex:0] != nil) { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      self.image = [self.imageArray objectAtIndex:0]; 
     }); 
    } 
}); 
+0

Grazie Steve, ma Ive provato che già . Quando faccio così, tutte le mie immagini saranno rese in modo casuale :) Ma ho solo bisogno di rendere le immagini una per una nell'ordine corretto dell'indice e per visualizzare la prima immagine ... Altre idee? – geforce

+0

Hmm, quindi sono un po 'confuso ora. Ho pensato che volevi solo mostrare la prima immagine e lasciare che tutte le altre immagini si caricassero sullo sfondo. Supponevo che il tuo metodo [self prerenderImageForIndex: i] stia facendo alcune chiamate di rete per ottenere un'immagine. Forse potresti postare quel metodo per darmi una migliore comprensione dell'intero quadro. – SteveB

+0

Grazie Steve, ho appena aggiunto il metodo "prerenderImageForIndex". Spero che questo aiuti ... – geforce

Problemi correlati