2013-07-01 52 views
0

我試圖從我打電話的塊中返回一個整數。你可以在下面看到它:從塊返回整數

-(NSInteger)globalRecord 
{ 
    __block NSInteger globalRecord = 0; 

    [GKLeaderboard loadLeaderboardsWithCompletionHandler:^(NSArray *leaderboards, NSError *error) { 
     GKLeaderboard *globalTaps = nil; 
     for (GKLeaderboard *lb in leaderboards) if ([lb.category isEqualToString:kGlobalLeaderboard]) globalTaps = lb; 

     [globalTaps loadScoresWithCompletionHandler:^(NSArray *scores, NSError *error) { 
      if ([scores count] != 0) 
      { 
       GKScore *topScore = [scores objectAtIndex:0]; 
       globalRecord = topScore.value; 
       //42 here 
      } 

     }]; 
    }]; 

    //0 here 

    return globalRecord; 
} 

所以我想從我的排行榜在遊戲中心獲得最高分。我希望我的方法在收到分數後返回分數,但不會返回我的分數。

在這個塊中,它識別得分,在這種情況下,42,但是一旦我們到達塊的外面,並想返回值0。

我真的不知道該怎麼做。任何幫助將不勝感激,謝謝。

回答

2

您正在獲得零,因爲返回實際上是在塊執行之前調用的。要獲得globalRecord值一旦塊loadScoresWithCompletionHandler結束,你應該使用一個回調:

-(void)globalRecord 
{ 
    __block NSInteger globalRecord = 0; 

    [GKLeaderboard loadLeaderboardsWithCompletionHandler:^(NSArray *leaderboards, NSError *error) { 
     GKLeaderboard *globalTaps = nil; 
     for (GKLeaderboard *lb in leaderboards) if ([lb.category isEqualToString:kGlobalLeaderboard]) globalTaps = lb; 

     [globalTaps loadScoresWithCompletionHandler:^(NSArray *scores, NSError *error) { 
      if ([scores count] != 0) 
      { 
       GKScore *topScore = [scores objectAtIndex:0]; 
       globalRecord = topScore.value; 
       [self globalRecordRetrieved:globalRecord]; 
       //42 here 
      } 

     }]; 
    }]; 
} 

- (void)globalRecordRetrieved:(NSInteger)record{ 
    NSLog(@"%d",record); //42 here 
} 
+2

+1用於提出解決方案,而不是像我一樣指出問題。兩種說法:1)__block變量不再需要。 2)完成處理程序可能在不同的線程上調用。要更新UI組件,應該使用'performSelectorOnMainThread:...'或類似的方法。 –

+0

你是對的globalRecordRetrieved應該調用performSelectorOnMainThread,或者他可以切換到'dispatch_async(dispatch_get_main_queue(),^ {/ *做一些UI安全的東西* /});'' –

4

loadLeaderboardsWithCompletionHandlerloadScoresWithCompletionHandler都是異步工作的。從 documentation

當這個方法被調用時,它會創建一個新的後臺任務處理 請求。該方法然後將控制權返回給您的遊戲。稍後,當 任務完成時,Game Kit會調用您的完成處理程序。 ...

這意味着,前值

[GKLeaderboard loadLeaderboardsWithCompletionHandler:...] 

回報已完成塊被分配到globalRecord

0

例如:

-(NSInteger)globalRecord 
{ 
    __block NSInteger globalRecord = 0; 

    dispatch_semaphore_t sema = dispatch_semaphore_create(0); 

    [GKLeaderboard loadLeaderboardsWithCompletionHandler:^(NSArray *leaderboards, NSError *error) { 
     GKLeaderboard *globalTaps = nil; 
     for (GKLeaderboard *lb in leaderboards) if ([lb.category isEqualToString:kGlobalLeaderboard]) globalTaps = lb; 

     [globalTaps loadScoresWithCompletionHandler:^(NSArray *scores, NSError *error) { 
      if ([scores count] != 0) 
      { 
       GKScore *topScore = [scores objectAtIndex:0]; 
       globalRecord = topScore.value; 
       dispatch_semaphore_signal(sema); 
      } 

     }]; 
    }]; 

    dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); 
    dispatch_release(sema); 
    //42 here 

    return globalRecord; 
} 

要小心!

本示例將阻止調用此方法的線程