ios 从块返回整数

dohp0rv5  于 2023-05-30  发布在  iOS
关注(0)|答案(3)|浏览(134)

我试图从我调用的块中返回一个整数。你可以在下面看到:

-(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。

cs7cruho

cs7cruho1#

loadLeaderboardsWithCompletionHandlerloadScoresWithCompletionHandler异步工作。来自文档:
调用此方法时,它将创建一个新的后台任务来处理请求。然后,该方法将控制权返回给您的游戏。稍后,当任务完成时,Game Kit调用您的完成处理程序。...
这意味着

[GKLeaderboard loadLeaderboardsWithCompletionHandler:...]

在完成块中为globalRecord赋值之前返回。

mklgxw1f

mklgxw1f2#

你得到的是零,因为return实际上是在块执行之前被调用的。要获取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
}
3hvapo4f

3hvapo4f3#

例如:

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

小心点!
此示例将阻止调用此方法的线程

相关问题