4

我正在创建一个带有菜单屏幕的简单文字游戏,其中显示了用户的所有活动匹配项。我想按从最近到最近最不活跃的顺序对这个匹配数组进行排序,但是与轮流玩家相关的唯一时间戳属性是GKTurnBasedParticipant...的属性GKTurnBasedMatch没有有用的排序属性。

GKTurnBasedMatch有一组GKTurnBasedParticipant对象作为属性,所以我当然可以想出某种解决方案,但我想不出任何不会真正混乱和低效的东西。有没有什么简单的方法NSPredicate可以在这样的情况下使用来深入研究每个参与者数组,查看最新的时间戳并一次性对所有匹配项进行排序?

4

2 回答 2

3

我没有NSPredicate基于 - 的解决方案,或者可能没有您希望的任何优雅的解决方案,但是我遇到了同样的问题并编写了自己的解决方案,实际上并没有那么糟糕。

我的解决方案是针对只能有两个参与者的游戏,因此请进行相应修改,但这是我最终使用的代码:

[myGamesArray sortUsingComparator:^NSComparisonResult(CHGame *game1, 
                                                      CHGame *game2) {

    if (YES == [game1 localPlayersTurn] && NO == [game2 localPlayersTurn]) {
        return NSOrderedAscending;
    } else if (NO == [game1 localPlayersTurn] && YES == [game2 localPlayersTurn]) {
        return NSOrderedDescending;
    }

    NSDate *lm1 = [game1.match lastMove];
    NSDate *lm2 = [game2.match lastMove];
    if (lm1 != nil && lm2 != nil) {
        return [lm1 compare:lm2];
    }

    return NSOrderedSame;

}];

whereCHGame是我为我的游戏构建的自定义类(具有GKTurnBasedMatch match属性),并且实例方法localPlayersTurn返回一个BOOL指示是否轮到本地参与者。

然后我lastMove在一个类别中写了一个方法GKTurnBasedMatch

- (NSDate *)lastMove {
    GKTurnBasedParticipant *localParticipant, *otherParticipant;
    NSDate *lastMove;

    for (GKTurnBasedParticipant *participant in self.participants) {
        if (YES == [participant.playerID isEqualToString:[GKLocalPlayer localPlayer].playerID]) {
            localParticipant = participant;
        } else {
            otherParticipant = participant;
        }
    }

    if (localParticipant == self.currentParticipant) {
        lastMove = otherParticipant.lastTurnDate;
    } else {
        lastMove = localParticipant.lastTurnDate;
    }

    return lastMove;
}

同样,这仅适用于总共两个参与者,但对于任意数量的参与者都可以轻松修改。

希望这会有所帮助,即使它不完全符合您的要求。

于 2013-03-25T15:36:47.610 回答
0

按当前参与者的最后一回合对回合制比赛进行排序

[GKTurnBasedMatch loadMatchesWithCompletionHandler:^(NSArray *matches, NSError *error)
 {
     NSString *descriptorKey = @"currentParticipant.lastTurnDate";

     NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:descriptorKey
                                                                      ascending:NO];
     
     NSArray *sortedMatches = [matches sortedArrayUsingDescriptors:@[sortDescriptor]];
 }];



按创建日期对回合制比赛进行排序

[GKTurnBasedMatch loadMatchesWithCompletionHandler:^(NSArray *matches, NSError *error)
 {
     NSString *descriptorKey = @"creationDate";

     NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:descriptorKey
                                                                      ascending:NO];
     
     NSArray *sortedMatches = [matches sortedArrayUsingDescriptors:@[sortDescriptor]];
 }];
于 2013-07-11T05:13:36.830 回答