阻止不执行我想要的方式,缺乏理解

时间:2012-12-19 11:31:23

标签: objective-c-blocks game-center

我正在尝试将Game Center应用到我的应用中,以下代码报告得分。

我正在尝试完成一个解决方案,如果播放器未经过身份验证,则应通过scoreReporter块将得分保存在scoreDictionary中。但是,当播放器未经过身份验证时,它永远不会出现“If(error!= nil)”语句。

事实上,它通过整个街区。如果本地播放器已通过身份验证,则执行该块。

这是我第一次详细研究Game Center和Block,所以我在这里有点迷失。

我想要完成的是如上所述。

我使用5.1作为目标。

-(void)reportScore:(int64_t)score forCategory:(NSString*)category {


NSLog(@"reportScore: %lli", score);
NSLog(@"category: %@",category);


GKScore *scoreReporter = [[GKScore alloc] initWithCategory:category];
scoreReporter.value = score;

NSLog(@"scoreReporter: %@", scoreReporter);



[scoreReporter reportScoreWithCompletionHandler:^(NSError *error) {

    NSLog(@"Execute the scoreReporter the block");

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                         NSUserDomainMask, YES);
    NSString *scoreFilePath = [NSString stringWithFormat:@"%@/scores.plist",[paths
                                                                             objectAtIndex:0]];
    NSMutableDictionary *scoreDictionary=[NSMutableDictionary
                                          dictionaryWithContentsOfFile:scoreFilePath];
    if (error != nil)
    {
        //There was an error so we need to save the score locally and resubmit later
        NSLog(@"Saving score for later");
        [scoreDictionary setValue:scoreReporter forKey:[NSDate date]];
        [scoreDictionary writeToFile:scoreFilePath atomically:YES];
    }
}];
}

播放器未经过身份验证时的NSLog输出:

reportScore: 80
category: com.xxxxxx.yyyyyyyHighScore
scoreReporter: <GKScore: 0xab611b0>player:(null) rank:0 date:2012-12-19 11:18:04 +0000 value:80 formattedValue:(null) context:0x0
验证播放器时

NSLog输出:

reportScore: 60
category: com.xxxxxx.yyyyyyyHighScore
scoreReporter: <GKScore: 0x964ce30>player:G:280817155 rank:0 date:2012-12-19 11:27:45 +0000 value:60 formattedValue:(null) context:0x0
Execute the scoreReporter the block

1 个答案:

答案 0 :(得分:0)

游戏中心编程指南说&#34;大多数游戏中心类只有在有经过身份验证的玩家时才会起作用,并且这些类隐含地引用本地玩家。例如,当您的游戏向排行榜报告分数时,它总是报告本地玩家的分数。如果没有经过身份验证的播放器,您的游戏必须禁用所有Game Center功能。&#34;

可能发生的事情是reportScoreWithCompletionHandler:根本没有运行,因此它没有完成&#34;因此它不会调用completionHandler。在reportScoreWithCompletionHandler之前测试经过身份验证的播放器:如果/ else,GameKit代码通常会出现以下几种情况:

if ( [GKLocalPlayer localPlayer].authenticated ) {
    ...
} else {
    ...
}