2012-05-04 15 views
5

Solo quiero prerender diferentes imágenes para un acceso rápido. Uso el despacho de grand central aquí para ejecutar los diferentes bloques.Grand Central Dispatch: ¿muestra la primera imagen cuando está cargada?

Después de iniciar la cola, quiero establecer la primera imagen cuando haya terminado. Con el código actual a continuación, lamentablemente, la primera imagen solo se mostrará cuando se hayan procesado todas las imágenes.

Entonces, ¿cómo puedo modificar el código? ¿Es posible obtener un delegado cuando cada imagen ha terminado?

tope aquí tienes el código:

// 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]; 
       } 
      }); 
     }); 
    } 

Actualización:

-(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; 

} 

sólo quiero saber cómo puedo cancelar/detener o reiniciar una cola de ejecución? ¿Es eso posible? Gracias por su ayuda.

Respuesta

2

usted tiene que utilizar una cola de serie, que ejecuta FIFO por ejemplo:

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

para las colas de despacho de serie un vistazo a: http://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html

+0

¡Sí, eso resuelve el problema! Muchas gracias. Asigno el "self.image" dentro de "dispatch_async (queue,^{". ¡Ahora funciona perfecto!) Sin embargo, echaré un vistazo a la documentación sobre eso. Gracias de nuevo. – geforce

2

No estoy seguro de por qué tiene las llamadas dispatch_async anidadas así, pero quizás ese es el problema. Me imagino que algo como lo siguiente lograría lo que quieres. Solo necesita obtener la cola principal cuando realmente desea hacer la actualización de UI, todo lo demás debe hacerse en la cola de fondo.

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

Gracias Steve, pero he probado que ya . Cuando lo hago así, todas mis imágenes serán renderizadas al azar :) Pero solo necesito renderizar las imágenes una por una en el orden correcto de índice y para mostrar la primera imagen ... ¿Alguna otra idea? – geforce

+0

Hmm, así que estoy un poco confundido ahora. Pensé que solo querías mostrar la primera imagen y dejar que todas las otras imágenes se cargaran en segundo plano. Asumí que su método [self prerenderImageForIndex: i] estaba haciendo una llamada de red para obtener una imagen. Tal vez podrías publicar ese método para que tenga una mejor comprensión de la imagen completa. – SteveB

+0

Gracias steve, acabo de agregar el método "prerenderImageForIndex". Espero que ayude ... – geforce

Cuestiones relacionadas