0

私はシンプルなフォームを持っています。いくつかの要素があります。いくつかの要素の表示が一時的に変化するのをユーザーに見てもらいたい。変更を設定し (多数のオブジェクトのアルファを変更)、データベースでいくつかの作業を行い、スリープ (1) アルファ設定を元に戻してから続行します。睡眠 (1) は非常に明白ですが、オブジェクトは目に見える変化はありません。

スリープはメソッド内にあるため、表示を更新する前にメソッドを完了する必要があると想定しています。グラフィックの変更を強制的に表示する方法はありますか?

ありがとうございます

4

1 に答える 1

0

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

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

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

そのため、たとえばperformSelector:withObject:afterDelay:orを使用して、スキームを非同期に変更する必要がありますdispatch_after。または、単純なアニメーションを作成している場合はanimateWithDuration:animations:completion:、フレンドを使用することをお勧めします。

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

于 2012-04-29T21:58:21.413 に答える