0

ゲーム センター サーバーからターン制ゲームの情報を返したいのですが、これは問題ありませんが、非同期メソッドを使用して取得したプレイヤー エイリアスが必要です。

[GKPlayer loadPlayersForIdentifiers:singleOpponentArray withCompletionHandler:^(NSArray *players, NSError *error) {

                GKPlayer *returnedPlayer = [players objectAtIndex:0];

                NSString *aliasToAdd = [NSString stringWithString:returnedPlayer.alias];
                NSString *idToAdd = [NSString stringWithString:returnedPlayer.playerID];
                NSDictionary *dictionaryToAddToAliasArray = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:aliasToAdd, idToAdd, nil] forKeys:[NSArray arrayWithObjects:@"alias", @"id", nil]];

                [self.aliasArray addObject:dictionaryToAddToAliasArray];


            }];

しかし、UI はこの情報を使用しており、時間内に到着しません。そのメソッドをメインスレッドで同期的に実行するにはどうすればよいですか?

ありがとう。

4

2 に答える 2

1

UI 関連のコードは、メイン スレッドで実行する必要があります。

非同期呼び出しが戻るまでアプリが待機する必要がある場合は、まず UI を無効にします。たとえば、 に設定userInteractionEnabled = NOしますUIView

次に、非同期メソッドが戻ったら、 を再度有効にしUIViewます。

それまでの間、何らかのアクティビティ インジケータを表示しますUIActivityIndicatorView

もちろん、バックグラウンドでタスクを実行できない場合にのみ上記を実行してください。不必要に UI をブロックしないでください。もちろん、すでに知っていると思いますが、これを読んでいる可能性のあるプラットフォームに不慣れな人のために、もう一度言い直す価値があります.

メイン スレッドで呼び出すには、NSObjectperformSelectorOnMainThreadメソッドのバリアントの 1 つを使用します。または、代わりに、関数を呼び出してメイン キューを使用して gcd でキューに入れますdispatch_get_main_queue

于 2012-04-17T15:33:35.170 に答える
0

これは、GCD 関数を使用して行うことができます。

// Show an UILoadingView, etc

[GKPlayer loadPlayersForIdentifiers:singleOpponentArray
              withCompletionHandler:^(NSArray *players, NSError *error) {

    // Define a block that will do your thing
    void (^doTheThing)(void) = ^(void){
        // this block will be run in the main thread....
        // Stop the UILoadingView and do your thing here
    };

    // Check the queue this block is called in          
    dispatch_queue_t main_q = dispatch_get_main_queue();
    dispatch_queue_t cur_q = dispatch_get_current_queue();
    if (main_q != cur_q) {
        // If current block is not called in the main queue change to it and then do your thing
        dispatch_async(main_q, doTheThing);
    } else {
        // If current block is called in the main queue, simply do your thing
        doTheThing();
    }
}];
于 2012-04-17T15:53:50.123 に答える