1

私はNSManagedObjectを持っています。これには次のような場所に保存されている画像があります/var/mobile/Applications/.../.../uniqueIDforNSMO/Pictures/

NSMOのuniqueIDに基づいてこれらの画像を検索することで、これらの画像をディスクから取り出すのに問題はありません。これらの画像を取得するDataControllerがあり、非常にパフォーマンスが高くなっています。しかし、これらの画像をビューに追加しようとすると問題が発生し、UIがブロックされます。問題は、これらの画像が非常に高解像度であることにあると思います(iPadのカメラロールからの画像です)。

5つの画像を表示するには、UIがブロックされたまま、約3秒かかります。2つの画像を表示するだけでも、UIがブロックされます。バックグラウンドスレッドでそれらを追加する方法は次のとおりです。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
    UIImage *image = [self.photos objectAtIndex:index];
    dispatch_async(dispatch_get_main_queue(), ^{
        cell.imageView.image = image;
    });
});

ディスパッチせずにimageView.imageを設定すると、さらに時間がかかります。

問題は、セルのimageViewsが150x150しかないのに、画像が非常に大きいことでしょうか?それとも、最初は画像への参照しかないので、画像の実現が遅いのでしょうか?

誰かがここで何かを提案できますか?配列に返される前に画像のサイズを変更しようとしましたが、役に立ちませんでした。

4

2 に答える 2

3

問題は、画像が遅延ロードされていることUIImageです。画像を描画する必要がある場合にのみ、画像をメモリにロードします。あなたができることは、バックグラウンドスレッドに画像を熱心にロードすることです:

  1. CGBitmapContextRefを使用して作成するUIGraphicsBeginImageContext
  2. 画像をコンテキストに描画します
  3. を使用してコンテキストから新しい画像を取得しますUIGraphicsGetImageFromCurrentImageContext
  4. 画像をメインスレッドに戻します
于 2012-10-18T16:41:34.440 に答える
0

高解像度の画像なので、そのために永続的なサムネイルキャッシュを作成することをお勧めします。毎回サムネイルをリアルタイムで生成すると、CPU時間が不必要に浪費されます。

于 2012-10-18T16:48:15.337 に答える