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.
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