2012-04-29 9 views
0

私はシンプルなフォームを持っています。いくつかの要素があります。私はユーザーに、ディスプレイの一時的な変化をいくつかの要素に見せたい。私は変更を設定し(オブジェクトの数にアルファを変更する)、データベースでいくつかの作業を行い、スリープ(1)アルファ設定を元に戻してから処理を進めます。睡眠(1)は非常に明白ですが、オブジェクトは視覚的に変化しません。グラフィックスの変更を強制的に表示するメソッド実行中

私は睡眠が私の方法の中にあるので、ディスプレイを更新する前にメソッドを完了しなければならないと仮定しています。グラフィカルな変更を強制的に表示する方法はありますか?

ありがとうヒープ

答えて

0

メインスレッドは、いわゆる実行ループを実行しています。これは基本的に次のように動作します。

  • 着信イベント(タッチ、タイマー、多分I/Oなど)を照会します。
  • これらのイベントに反応してください。
  • UIを更新します。
  • を繰り返します。

あなたのコードは、通常、「イベントに反応する」段階で実行されます。あなたはUIオブジェクトを変更しますが、スリープ状態になると "UIの更新"の部分は実行できません。メインスレッドでスリープしている間は、UIの更新やアニメーションが実行されず、タッチも処理されません。これが、あなたが決してメインスレッドをブロックすることがない理由です。

スキームを非同期に変更する必要があります。たとえば、performSelector:withObject:afterDelay:またはdispatch_afterを使用します。単純なアニメーションをやっているだけの場合は、animateWithDuration:animations:completion:と友だちを使用してください。

非同期では実行できないことを実行する必要がある場合は、別のスレッドで実行する必要があります。次に、メインスレッドでUIを更新します。performSelectorOnMainThread:withObject:waitUntilDone:またはdispatch_sync or dispatch_async(ほとんどすべてのUIアップデートはメインスレッドで行う必要があります)。

+0

ありがとうございました。私は多くを推測しましたが、あなたが尋ねるまではわかりません。計画Bのための時間ではなく、かわいいが効果的..... :-) –

関連する問題