我正在创建一个简单的文字游戏与菜单屏幕,其中我正在显示用户的所有活动的匹配。我想按从最近到最近最不活跃的顺序对这个比赛数组进行排序,但是与球员轮流相关的唯一时间戳属性是GKTurnBasedParticipant
的属性...GKTurnBasedMatch
没有有用的排序属性。
GKTurnBasedMatch
有一组GKTurnBasedParticipant
对象作为属性,所以我肯定能想出某种解决方案,但我想不出任何不是真正混乱和低效的解决方案。有没有办法在这样的情况下使用像NSPredicate
这样简单的东西来深入到每个参与者数组,查看最新的时间戳,并一次性对所有匹配进行排序?
发布于 2013-03-25 15:36:48
我没有NSPredicate
-based解决方案,或者可能没有您希望的那么优雅,但我遇到了同样的问题,并编写了自己的解决方案,实际上并没有那么糟糕。
我的解决方案是针对一个只能有两个参与者的游戏,因此进行相应的修改,但以下是我最终使用的代码:
[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;
}];
其中CHGame
是我为我的游戏(具有GKTurnBasedMatch
match
属性)构建的自定义类,实例方法localPlayersTurn
返回一个BOOL
,指示是否轮到本地参与者。
然后我在GKTurnBasedMatch
上的一个类别中编写了一个lastMove
方法
- (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-07-11 05:13:37
按当前参与者的最后一个回合对基于回合的比赛进行排序
[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]];
}];
https://stackoverflow.com/questions/15527854
复制