私は、NSURL ロードと Web からのイメージを提供し、完了ブロックを実行するイメージ ローダー クラスを持っています。コードは実際には非常に単純です
- (void)downloadImageWithURL:(NSString *)URLString completion:(BELoadImageCompletionBlock)completion
{
dispatch_async(_queue, ^{
// dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
UIImage *image = nil;
NSURL *URL = [NSURL URLWithString:URLString];
if (URL) {
image = [UIImage imageWithData:[NSData dataWithContentsOfURL:URL]];
}
dispatch_async(dispatch_get_main_queue(), ^{
completion(image, URLString);
});
});
}
交換したら
dispatch_async(_queue, ^{
コメントアウトして
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
画像の読み込みがはるかに高速になりました。これは非常に論理的です (以前は画像が一度に 1 つずつ読み込まれていましたが、現在は多数の画像が同時に読み込まれています)。私の問題は、おそらく 50 個の画像があり、それらすべてに対して downloadImageWithURL:completion: メソッドを呼び出し、_queue の代わりにグローバル キューを使用すると、アプリが最終的にクラッシュし、85 以上のスレッドがあることがわかります。問題は、dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0) を 50 回連続して呼び出すと、GCD が作成するスレッドが多すぎることでしょうか? gcd がすべてのスレッドを処理し、スレッド数が膨大にならないようにしていると思いましたが、そうでない場合、スレッド数に影響を与える方法はありますか?