2012-05-04 19 views
5

私はちょうど高速アクセスのために異なったイメージをprerenderしたいです。 ここでは、さまざまなブロックを実行するためにグランドセントラルディスパッチを使用します。Grand Central Dispatch - 最初の画像がロードされたら表示しますか?

キューを開始した後、最初のイメージを設定します。 以下のコードでは、残念ながら最初の画像はすべての画像がレンダリングされたときにのみ表示されます。

コードを変更するにはどうすればよいですか?各画像が完成したらデリゲートを取得することは可能ですか?

Here'sコード:

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

更新:

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

} 

私はちょうど私が/停止を解除または実行中のキューを再起動しない方法を知りたいですか? これは可能ですか? ご協力いただきありがとうございます。

答えて

2

:シリアルディスパッチキューの

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

を見て: http://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html

+0

ええ、それは問題を解決します!どうもありがとうございました。私は "self.image"を "dispatch_async(queue、^ {"。)内に割り当てますが、今は完璧に動作します!それでも、私はそのドキュメントを見ていきます。 – geforce

2

dispatch_async呼び出しがこのようにネストされているのはなぜか分かりませんが、おそらくそれが問題です。私は、あなたが望むものを達成するために、以下のようなものがあると思います。実際にUI更新をしたいときは、メインキューを取得するだけで、その他はすべてバックグラウンドキューで実行する必要があります。あなたは、たとえばFIFOを実行し、シリアルキュー、使用する必要が

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

おかげでスティーブが、i'veはすでにそれをテストしました。私はそれを好きにすると、私のすべての画像はランダムにレンダリングされます:)しかし、私はちょうど正しいインデックス順に画像を1つずつレンダリングし、最初の画像を表示する必要があります...他のアイデア? – geforce

+0

ええ、今私は少し混乱しています。最初の画像を表示し、他のすべての画像をバックグラウンドで読み込ませたいと思っていました。あなたの[self prerenderImageForIndex:i]メソッドがイメージを取得するためにネットワークコールを行っていると仮定していました。たぶんあなたは私が全体の画像のより良い理解を与えるためにその方法を投稿することができます。 – SteveB

+0

Steveに感謝します。ちょうど "prerenderImageForIndex"メソッドを追加しました。希望が助けてくれます... – geforce

関連する問題