2012-05-04 20 views
5

Po prostu chcę wstępnie wyrenderować różne obrazy, aby uzyskać szybki dostęp. Używam tutaj głównej centralnej wysyłki do wykonania różnych bloków.Grand Central Dispatch - wyświetla pierwszy obraz po załadowaniu?

Po uruchomieniu kolejki chcę ustawić pierwszy obraz po jego zakończeniu. Przy obecnym kodzie poniżej niestety pierwszy obraz zostanie wyświetlony tylko po wyrenderowaniu wszystkich obrazów.

Jak mogę zmienić kod? Czy można uzyskać delegata po zakończeniu każdego obrazu?

Here's kodu:

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

Aktualizacja:

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

} 

chcę tylko wiedzieć, w jaki sposób mogę anulować/stop lub ponownie uruchomić kolejkę uruchomiony? Czy to możliwe? Dzięki za pomoc.

Odpowiedz

2

trzeba użyć szeregowego kolejkę FIFO, który wykonuje na przykład:

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

dla szeregowych kolejek Dispatch przyjrzeć: http://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html

+0

Tak, to rozwiązuje problem! Dziękuję Ci bardzo. Przypisuję "self.image" w "dispatch_async (queue,^{". Teraz działa idealnie!) Niemniej jednak zajrzę do dokumentacji na ten temat. Jeszcze raz dziękuję. – geforce

2

Nie jestem pewien, dlaczego masz wywołania dispatch_async zagnieżdżone w ten sposób, ale może to jest problem. Mogę sobie wyobrazić, że coś jak poniżej mogłoby osiągnąć to, co chcesz. Trzeba tylko uzyskać główną kolejkę, gdy rzeczywiście chcesz wykonać aktualizację interfejsu, wszystko inne powinno zostać zrobione w kolejce w tle.

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

Dzięki Steve, ale Ive testowany że już . Kiedy to zrobię, wszystkie moje obrazy będą renderowane losowo :) Ale po prostu muszę renderować obrazy jeden po drugim we właściwej kolejności indeksowania i wyświetlać pierwszy obraz ... Jakieś inne pomysły? – geforce

+0

Hmm, więc jestem teraz nieco zdezorientowany. Myślałem, że chcesz tylko pokazać pierwszy obraz i pozwolić, aby wszystkie inne obrazy ładowały się w tle. Zakładałem, że twoja metoda [self prerenderImageForIndex: i] wykonała pewne połączenie sieciowe, aby uzyskać obraz. Może mógłbyś opublikować tę metodę, aby lepiej zrozumieć cały obraz. – SteveB

+0

Dzięki steve, właśnie dodałem metodę "prerenderImageForIndex". Mam nadzieję, że pomaga ... – geforce

Powiązane problemy