バックグラウンドスレッドのリソースから画像をロードするにはどうすればよいですか?UIスレッドから画像をロードしていますか?
は、私は現在、これをやっている、それはかなり私のUIで物事を遅く:
image = [NSData dataWithContentsOfFile:imageName];
私はむしろそれがバックグラウンドスレッドでそれをロードします。
バックグラウンドスレッドのリソースから画像をロードするにはどうすればよいですか?UIスレッドから画像をロードしていますか?
は、私は現在、これをやっている、それはかなり私のUIで物事を遅く:
image = [NSData dataWithContentsOfFile:imageName];
私はむしろそれがバックグラウンドスレッドでそれをロードします。
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
});
});
私はこれをやっていますが、5 dataWithContentsOfFileを呼び出して5MBのJPGをディスクから取得します。私はあなたの解決策として5つのキューで分割し、NSOperationQueueと同じロジックを使用することで試しましたが、どちらもまだUIをブロックしています。これにはスレッドがたくさんありますが、私は良い解決策を見つけることができません。ローカルアセット/ファイルの非同期ロードに関するdoc/refを知っていますか? – Mat
あなたはCGImage
を開くためにCGDataProvider
を使用することができます。
たとえば、CGImageCreateWithPNGDataProvider
を使用でき、データプロバイダはCFURL
を参照します。同様の手法をCFData
表現に使用することもできます。
次に、CGImage
を使用するか、メインスレッドに戻り、UIImage
という表現を作成することができます。
最後に、CFData
またはNSData
をセカンダリスレッドからロードしてから、メインスレッドに戻り、何かを行うことができます。
UIImage
が不変型であり、場合によってはキャッシュを使用することにも注意してください。同じ表現を何度も読み込んでいる場合は、その最適化を無効にしていないことを確認してください。
GCDを使用してその行をラップすることはできませんか? –
私はiOSに精通しておらず、学習しています。例を挙げていただけますか? –
まあ、私が言ったことは、janoが言ったことでした。あるいは、performSelectorInBackground(NSObjectメソッド)を使用することができます。 –