0

私は次の方法を持っています:

-(void) waitForStatusChangeAndPerformBlock:(MyBlockType)successBlock;

これはメソッドが行うべきことです:

  1. status一部が正しい値を持っているかどうかを確認します
  2. ブロックを呼び出す場合successBlock
  3. statusが指定された値に変更されるのを待ってからブロックを呼び出す場合successBlock

値が変更されたかどうかを確認するために KVO を考えましたが、ブロックをインスタンス変数に格納するか、さらに悪いことに配列に格納する必要があり、現在のメソッド呼び出しのコンテキストが失われます。だから私が本当に欲しいのは次のようなものです:

-(void) waitForStatusChangeAndPerformBlock:(MyBlockType)successBlock{
  if(self.status == kDesiredStatus){
    successBlock;
  } else {

      [TheMagicDispatchWaitUntil:(self.status == kDesiredStatus) andThenDoThis:^{
         successBlock;
      }];   
   }
}

KVO やその他のヘルパー メソッドを使用せずにこれを実現する方法はありますか?

4

2 に答える 2

1

スレッドにイベント (メッセージ、タイマーなど) を待機させたい場合は、Concurrent NSOperation を使用することをお勧めします。これらのオブジェクトは別のスレッドで実行されますが、runLoop があるため、何かが起こるのを待っている runloop コールバック内で「通常の」方法でブロックできます。

とはいえ、これらを機能させるには少しコツが必要です。gthubにデモ プロジェクトがあり、並行 NSOperations を探索できます (他にもあります)。

(スレッド上で) 何かが完了するまでブロックするもう 1 つの良い方法は、"dispatch_wait()" を使用することです。これは、グループに属してキューに入れられたすべてのブロックを待機します。この手法は非常に簡単に習得できます。ディスパッチ グループを作成して標準のキューを使用するか、独自のキューを作成してから、dispatch_group 関数を使用してブロックをキューに入れます。すべてがキューに入れられたら、ブロックが完了するまで dispatch_wait(forever) します。

于 2012-08-12T12:43:30.340 に答える
0

単純なルーチンを実行していて、このメソッドを頻繁に呼び出す必要がない場合は、while ステートメントを使用してみませんか?

while (self.status != kDesiredStatus);

do {TheMagicDispatch}

succesBlock;
于 2012-08-11T10:25:50.033 に答える