2011-03-04 17 views
1

iPadアプリでは、より大きなUIViewの中にたくさんのUIImageViewsがあります。各UIImageViewには、別のスレッドで生成されたサムネイルが含まれています(アプリケーションをフリーズしないように)。サムネイルが正常に生成された後、私はsetNeedsDisplayをメインスレッドで呼び出しますが、親指が利用可能になるとUIImageViewsは更新されません(ログに表示されます)。約5秒かかります。一度。UIViewの更新に時間がかかりすぎる

ここでサムネイルが別のスレッドで作成されたとき、私がやっているものです:

[self performSelectorOnMainThread:@selector(setNeedsDisplay) 
         withObject:nil 
        waitUntilDone:NO]; 

任意のアイデアは?

答えて

0

あなたのメインスレッドは何ですか?再描画する前にすべてのサムネイルが利用可能になるまでアプリケーションが待機する場合は、サムネイルキューが空になるまでメインスレッドで誤ってブロックされているように見えます。どのようにスレッドを設定していますか?

+0

いいえ、私のメインスレッドは、ユーザーがビューとのやり取り(ドラッグ、アレンジなど)を可能にします。だからそれは失速しない。これは、サムネイルをロードするために別のスレッドを使用しているためUIがぎこちないように見える理由です。私はスレッド化のためにNSOperationQueueを使用しています。スレッドはスレッドが約200ミリ秒かけて仕事を終えていることを示しています。サムネイルは約5秒後にのみ表示されます。 –

+1

メインスレッドで 'setNeedsDisplay'を呼び出していると言われますが、バックグラウンドスレッドからUIKit *とやりとりしていますか? – Jim

+0

いいえ、まったくありません。私はちょうどソースイメージを読んで、それらのサイズを変更し、UIIImageViewでそれらを設定する、ああ待って、私はUIImageViewでそれらを設定することはできませんできますか?おっとっと。それは愚かな間違いでした。恥ずかしいです。 Jimに感謝します。問題は修正されました。 –

0

問題は、「今」を再描画する必要があることをココアに伝えることができないことです。 setNeedsDisplayを使用すると、図面がかなり高価なプロセスであるため、一度に再描画を注文することができます。

setNeedsDisplay

あなたは、このメソッドまたは setNeedsDisplayInRectを使用することができます。あなたのビューの内容を再描画し を必要 システムに通知します。このメソッドは、 に要求を書き留め、すぐに を返します。ビューは実際には 次の描画サイクルまで再描画されません。 すべての無効化ビュー が更新されます。

Mybeは、生成されたサムネイルすべてを待つために、より優れた、より効果的な解決策ですか?

+0

UIImageViewsをドラッグすると、再描画されるべきではありません。私が理解できないのは、サムネイルの表示を開始するまでに時間がかかる理由です。 –

0

私はNSNotificationを使用します。イメージの準備ができたら、イメージをロードするスレッドから通知を送信します。ビューコントローラはこれらの通知を観察し、到着時にビューを更新することができます。

関連する問題