2011-07-17 7 views
-1

のタッチのコードにおける一定の場所で待機している:私はこのコードを持っている(私はメインループに待つことができないため)、スレッド、例えば画面

-(void) game { 
for (Players player in players) { 
    if (player.type == IA) {  // computer plays 
     answer = [player play]; 
    else { 
     [ui showQuestion];   // user plays with the touch screen 
     // here waiting for the answer touch 
     answer = ???????????????? // return from waiting after touch callback 

    } 
    [answersArray addObject:answer]; 
} 
answer = [self bestAnswer : answersArray]; 
[ui showTheBestAnswer : answer]; 

}

固定のコード場所でUIイベントを待つソリューションはありますか? もちろんメインループをブロックすることはありません。

は、まず jpdms

+2

全体の構成が不自然に見えます。メインループからトリガされたイベントに基づいて実行します。状態を保存してそれに応じて反応させるだけです。 – Eiko

答えて

1

、あなたの助けをありがとうございました、私は非常には、Xcodeのドキュメントに含まれているAppleの並行処理プログラミングガイドを、読むことをお勧めします。一般的に、スレッドにはるかに優れた選択肢があります。特に、提供する例ではそうです。しかしながら

game方法は、別のスレッド上で実行されている場合は、スレッドを通知するための適切な方法は、NSConditionを使用しています。インスタンスを作成し、上記のコードとタッチハンドラの両方がそのインスタンスにアクセスできることを確認します。 game方法で

NSCondition *playerDidTouchCondition = [[NSCondition alloc] init]; 

、あなたはこのような状態で待機:条件が通知されるまで

[ui showQuestion]; 
[playerDidTouchCondition lock]; 
[playerDidTouchCondition wait]; 
[playerDidTouchCondition unlock]; 
// do something with answer 

あなたのゲームスレッドがスリープします。あなたがこれを行うだろう、あなたのタッチハンドラで:

answer = whatever the user did 
[playerDidTouchCondition lock]; 
[playerDidTouchCondition signal]; // wake up one of the sleeping threads 
[playerDidTouchCondition unlock]; 

あなたは上記の持っているサンプルコードは本当にしかし、別のスレッドの必要性を示すものではありません。あなたはどこかでcurrentPlayerIndexを非常に簡単に保存して、答えボタンのボタンハンドラーの中の次のプレーヤーに進むことができます。

また、UIの更新が実際にメインスレッドで行われていることを確認する必要があります。 [ui showQuestion]のような行がメインスレッドで待ち行列に入っていることを願っています。 Cocoaでは、次のような方法で簡単にこれを行うことができます:[ui performSelectorOnMainThread:@selector(showQuestion)];

本当に本当に本当に本当に別のスレッドを使ってはいけません。

関連する問題