Grand Central Dispatch - 加载后显示第一张图片?

gef*_*rce 5 iphone grand-central-dispatch ios

我只想预先渲染不同的图像以便快速访问.我在这里使用grand central dispatch来执行不同的块.

启动队列后,我想在完成后设置第一个图像.使用下面的当前代码,遗憾的是,只有在渲染了所有图像时才会显示第一张图像.

那我怎么修改代码呢?每个图像完成后是否可以获得代理?

这是代码:

// 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];
                }
            });
        });
    }
Run Code Online (Sandbox Code Playgroud)

更新:

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

}
Run Code Online (Sandbox Code Playgroud)

我只是想知道如何取消/停止或重新启动正在运行的队列?那可能吗?谢谢你的帮助.

Jon*_*hon 2

你必须使用串行队列,它执行 FIFO 例如:

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
    });
}
Run Code Online (Sandbox Code Playgroud)

对于串行调度队列,请参阅: http://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html