8

次を使用して、ローカル URL から画像を読み込もうとしています。

UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:fileURL]];
[self.imageView setImage:image];
NSLog(@"imageView set");

そのため、コンソールに "imageView set" が表示されるのはほぼすぐですが、UI に反映されるまでに非常に長い時間がかかります (場合によっては数分!)。

なぜこれが起こっているのですか?

4

4 に答える 4

9

これは、バックグラウンド スレッド (画像ファイルをダウンロードしていたスレッド) で画像を設定していたときに発生しました。コードがメインスレッドで実行されていることを確認してください。すぐにイメージが変わります。

// In a background thread...

UIImage *image = ... // Build or download the image

dispatch_async(dispatch_get_main_queue(), ^{ 
    [self.imageView setImage:image]; // Run in main thread (UI thread)
});
于 2015-02-25T10:02:04.300 に答える
4

インストゥルメントをロードして、それが何をしているのかを正確に確認する必要があります。

まず、描画スレッドでの I/O を回避するためにできることを行う必要があります。また、同時に他の I/O 要求がありますか?

AUIImageは、必ずしも単一のビットマップ表現である必要はありません。キャッシュによってバックアップされたり、遅延ロードされたりする場合があります。したがって、「イメージ」が「設定」されているからといって、最適なビットマップがメモリにロードされ、レンダリングの準備が整っているわけではありません。レンダリング (描画) が要求されるまで延期される可能性があります。

OTOH のプロファイルを作成すると、(一般的に) 予想よりも時間がかかっている理由がわかります。

于 2013-05-20T04:50:20.110 に答える
-1

NSData からのイメージの読み込みに時間がかかります。代わりに、次のコードを使用できます。

UIImage *image = [UIImage imageWithContentsOfFile:fileURL];

それを試してみてください。

于 2013-05-20T04:49:50.733 に答える
-2

だから私は次のことを試しました:

dispatch_async(dispatch_get_global_queue(0, 0), ^{
    UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:fileURL]];
    [self.imageView setImage:image];
    NSLog(@"imageView set");
});

そして、それはかなり高速です。理由はわかりませんが。

于 2013-05-20T04:50:47.820 に答える