2011-10-29 14 views
0

バックグラウンドスレッドのリソースから画像をロードするにはどうすればよいですか?UIスレッドから画像をロードしていますか?

は、私は現在、これをやっている、それはかなり私のUIで物事を遅く:

image = [NSData dataWithContentsOfFile:imageName]; 

私はむしろそれがバックグラウンドスレッドでそれをロードします。

+2

GCDを使用してその行をラップすることはできませんか? –

+0

私はiOSに精通しておらず、学習しています。例を挙げていただけますか? –

+1

まあ、私が言ったことは、janoが言ったことでした。あるいは、performSelectorInBackground(NSObjectメソッド)を使用することができます。 –

答えて

5
dispatch_queue_t backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
dispatch_queue_t mainQueue = dispatch_get_main_queue(); 
dispatch_async(backgroundQueue,^{ 
    // background process 
    image = [NSData dataWithContentsOfFile:imageName]; 
    dispatch_async(mainQueue,^{ 
    // always update GUI from the main thread 
    // uiimageview.image = image.... etc 
}); 
}); 
+0

私はこれをやっていますが、5 dataWithContentsOfFileを呼び出して5MBのJPGをディスクから取得します。私はあなたの解決策として5つのキューで分割し、NSOperationQueueと同じロジックを使用することで試しましたが、どちらもまだUIをブロックしています。これにはスレッドがたくさんありますが、私は良い解決策を見つけることができません。ローカルアセット/ファイルの非同期ロードに関するdoc/refを知っていますか? – Mat

3

あなたはCGImageを開くためにCGDataProviderを使用することができます。

たとえば、CGImageCreateWithPNGDataProviderを使用でき、データプロバイダはCFURLを参照します。同様の手法をCFData表現に使用することもできます。

次に、CGImageを使用するか、メインスレッドに戻り、UIImageという表現を作成することができます。

最後に、CFDataまたはNSDataをセカンダリスレッドからロードしてから、メインスレッドに戻り、何かを行うことができます。

UIImageが不変型であり、場合によってはキャッシュを使用することにも注意してください。同じ表現を何度も読み込んでいる場合は、その最適化を無効にしていないことを確認してください。

関連する問題