0

画像カタログ iPad アプリケーションを構築しています。低解像度のサムネイル (250 * 500 ピクセル) と高解像度のフル イメージ (2048X2048 ピクセル) の 2 種類の画像を使用しています。高解像度画像のサイズはそれぞれ 200kb から 10mb です。高解像度の画像をダウンロードするための遅延読み込みとマルチスレッドを実装しました。

画像カタログ アプリケーションであるため、合計画像数は 200 から 500 の間です。このアプリケーションにはオフライン サポートがあるため、ダウンロードしたすべての画像を後で表示するために画像をアプリケーション ドキュメント ディレクトリに保存しています。画像をアルファベット順に並べ替える機能があるため、UIScrollView を使用してすべての低解像度画像を同時に画面に表示する必要があります。

新しい高解像度画像が呼び出されると、画像が初めて開かれるたびに、ほとんどの場合、画像は 3 ~ 8 秒かかります。これにより、アプリがほとんどフリーズし、ユーザーは他の操作を行う前に 3 ~ 8 秒待たなければなりません。

私の開発者は、現在のイメージが完全にメモリにダウンロードされるまで、ユーザーが現在のアクションを停止して次のイメージに移動できるようにする簡単な方法はないと言っています。

専門家は、高解像度画像がダウンロードされているときに、ユーザーのアクションが現在の高解像度画像のダウンロードに取って代わるようにコードを実装できるはずだと思いますか. たとえば、指でスワイプすると、ヘッダー バー (戻るボタン、設定ボタンを含む) が有効になり、ユーザーは次の画像に移動しますか?

迅速な返信ありがとうございます。しかし、質問で述べたように、遅延読み込み/マルチスレッドを使用しました。つまり、NSURLConnection 非同期要求を使用しました。テキストデータでなくても、ダウンロードにはメインスレッドを使用していません。

NSURLConnection とデリゲートを使用して Image Downloader クラスを作成しました。各画像のリクエストの成功/失敗後に、対応するコントローラーに通知を送信するカスタム プロトコルを作成しました。

@protocol TImageDownloaderDelegate

-(void)imageDownloadedSuccessfully:(ImageDownloader *)inDownloader;
-(void)prImageDownloadedSuccessfully :(ImageDownloader *)inDownloader;

@end

問題は、UIScrollView を使用して同じ画面に複数の (160 を超える) 画像があり、各画像に高解像度の画像 (200KB から 10 MB のサイズ) があり、高解像度の画像をダウンロードしていて、各画像をダウンロードした直後に、爽やかな景色です。そのため、ビューを何度もレンダリングしている間、スクロールがあまりスムーズにならないことがあります。そのため、アプリケーションのパフォーマンスを改善する方法を探しています。

4

2 に答える 2

2

これを行う方法は絶対にあります (実際には、いくつかの方法があるかもしれません)。私の好みの方法は、NSURLConnectionインスタンスを使用して、より大きなイメージのダウンロードを管理することです。イメージへの接続を作成し、ユーザーが要求した場合や別のイメージに移動する必要がある場合は、後でキャンセルできます。

さらに、画像をダウンロードするときにアプリケーションがフリーズしないようにする必要があります。ユーザー インターフェイスの適切なパフォーマンスを妨げないように、開発者にこれらのダウンロードをバックグラウンド スレッドに配置させる必要があります。ネットワーク接続が長時間続くためにアプリケーションが応答しない場合は、オペレーティング システムによって終了されることさえあります。NSURLConnection インスタンスのバックグラウンド化または iOS での一般的なスレッド化に関するオンライン ガイドが多数あります。そのうちの 1 つに従うことを強くお勧めします。

編集: AmitS から提供された追加情報を使用して、問題のビューの遅延再レンダリングに取り組むこともお勧めします。ダウンロードをバッチ処理して、ユーザーの表示領域内のすべての画像がダウンロードされたときにのみ再レンダリングするか、160 以上の高解像度画像を 1 つの画面にレンダリングしないことを検討できます。そのサイズでは、サムネイルで十分であり、高解像度のレンダリングを延期できます-res 画像は、ユーザーがズームインするか、選択して画面いっぱいに表示するまで表示されません。160 の高解像度画像をすべて同じビューにレンダリングする必要があるかどうかを慎重に検討してください。非常に多くの画像をレンダリングする際にパフォーマンスが低下すると、そもそも画像を高解像度にすることによるユーザーのメリットが失われる可能性があります。

于 2012-07-08T21:51:37.417 に答える
1

原則として可能ですが、キャンセルのジェスチャーやタップにアプリがすぐに反応しない場合があります。ここでNSOperation説明されているように、 を使用して長時間実行アクションをキャンセルできます(「キャンセル コマンドへの応答」を検索してください)。

また、@Tim が回答で述べているように、大きな画像の読み込み中にアプリがフリーズすることはありません。これが発生した場合は、イメージのダウンロードが間違って実装されていることを意味します (おそらくメイン スレッドで実行されますが、これは根本的な間違いです)。

于 2012-07-08T21:57:42.957 に答える