0

重複の可能性:
待って、Objective c で同等に通知しますか?

javaからObjective cにwaitメソッドを実装するにはどうすればよいですか? 私はコードを持っています: wait(a); where a - 整数の変数。

4

3 に答える 3

1

GCDからのディスパッチセマフォを使用するのはどうですか?ディスパッチセマフォに関するAppleのドキュメントには、次のように書かれています。

ディスパッチセマフォは従来のセマフォに似ていますが、一般的に効率的です。セマフォが使用できないために呼び出し元のスレッドをブロックする必要がある場合にのみ、ディスパッチセマフォがカーネルに呼び出します。セマフォが使用可能な場合、カーネル呼び出しは行われません。ディスパッチセマフォの使用方法の例については、「ディスパッチセマフォを使用した有限リソースの使用の規制」を参照してください。</ p>

以下は、私が取り組んでいるカードゲームの例です。メインスレッドは、何らかの条件(プレイヤーが自分のターンを終了した)が承認されるまで待機します。

   // a semaphore is used to prevent execution until the asynchronous task is completed ...

   dispatch_semaphore_t sema = dispatch_semaphore_create(0);


   // player chooses a card - once card is chosen, animate choice by moving card to center of board ...

   [self.currentPlayer playCardWithPlayedCards:_currentTrick.cards trumpSuit:_trumpSuit completionHandler:^ (WSCard *card) {

       BOOL success = [self.currentTrick addCard:card];

       DLog(@"did add card to trick? %@", success ? @"YES" : @"NO");

       NSString *message = [NSString stringWithFormat:@"Card played by %@", _currentPlayer.name];
       [_messageView setMessage:message];

       [self turnCard:card];
       [self moveCardToCenter:card];


       // send a signal that indicates that this asynchronous task is completed ...

       dispatch_semaphore_signal(sema);

       DLog(@"<<< signal dispatched >>>");
   }];


   // execution is halted, until a signal is received from another thread ...

   DLog(@"<<< wait for signal >>>");

   dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
   dispatch_release(sema);
于 2012-07-30T16:04:57.307 に答える
0

別のスレッドがコードのクリティカル セクションにアクセスするのをブロックする場合は、 @synchronizedディレクティブを使用できます。待つために待ちたいだけなら... のperformSelector:withObject:afterDelay:メソッドを使用できますNSObject

于 2012-07-30T15:48:46.790 に答える
-3

C関数スリープを使用できます

sleep(5);  // sleep for 5 seconds

メインスレッドをブロックせずに待機する場合は、次を使用します。

[self performSelector:@selector(delayFunction:) withObject:nil afterDelay:5.0];
于 2012-07-30T15:35:22.360 に答える