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]; 


      }]; 

但是用戶界面使用這些信息,並沒有及時到達。我怎樣才能讓這個方法在主線程上同步執行?

謝謝。

回答

1

任何與UI相關的代碼都必須在主線程上執行。

如果您的應用必須等待異步調用返回,那麼請先禁用UI。例如,在您的UIView上設置userInteractionEnabled = NO

然後,當異步方法返回時,重新啓用UIView

與此同時,顯示某種活動指標,例如, UIActivityIndicatorView

當然,只有在不能在後臺執行任務的情況下才可以執行上述操作。永遠不要不必要地阻止用戶界面。我相信你當然已經知道,但是值得重申的是,任何剛剛接觸這個平臺的人都可以閱讀。

要調用主線程,請使用NSObjectperformSelectorOnMainThread方法的變體之一。或者,通過調用dispatch_get_main_queue函數,使用主隊列將其排隊在gcd上。

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(); 
    } 
}];