返回+ [GKPlayer loadPlayersForIdentifiers:completionHandler:]中的数组顺序

时间:2012-10-24 18:51:30

标签: objective-c ios game-center gamekit

因此,要对排行榜数据做一些有用的事情,首先必须从GKScore获取GKLeaderboard的数组,然后为每个分数获取相应的GKPlayer s。

一旦你有了这个,你可能想要一个字典映射玩家得分或分数给玩家或playerID s得分value或其他一些。使用+[NSDictionary dictionaryWithObjects:forKeys:]设置这样的字典会很好,因为我们已经有了数组。

问题是:这些数组保证的顺序是否相同?即可以安全地执行以下操作:

GKLeaderboard *leaderboard = [[GKLeaderboard alloc] init];
[leaderboard loadScoresWithCompletionHandler:^(NSArray *scores, NSError *error) {
    NSArray *playerIDs = [scores valueForKey:@"playerID"];
    [GKPlayer loadPlayersForIdentifiers:playerIDs withCompletionHandler:^(NSArray *players, NSError *error) {
        self.scores = [NSDictionary dictionaryWithObjects:scores forKeys:players];
    }];
}];

(为简洁起见,省略了错误处理和ARC安全性。)

我知道[scores valueForKey:@"playerID"]将以与分数相同的顺序为我提供一个playerID数组 - 这就是数组valueForKey:应该做的事情。但是loadPlayers的完成处理程序是否保证获取的玩家得分数组与输入的顺序相同?我已经创建了一些沙盒帐户并完成了一些测试,看起来排序顺序总是匹配,但这并不能保证。

文档中没有任何说法。 (它确实说在错误的情况下数组可能包含部分结果,在这种情况下它显然不会映射到输入,但是无错误情况呢?)对{{{}上的两个数组进行排序非常简单当然,但如果总是已经对数组进行排序,那么必须花时间对数组进行排序会很遗憾。

1 个答案:

答案 0 :(得分:0)

我猜它与方法名称相同但不保证它和实现细节。我想我不会依赖它。

我会再次调用sort ...现在(因为它们已经排序)将导致排序算法的最佳情况运行时...所以。上)。在任何情况下,你都会是圣人:)