我目前正在使用 Parse 为 iOS 构建一个简单的消息服务,用户可以在其中相互发送提醒。
在主屏幕上,警报将按用户分组,之前显示的警报也会显示。
最近的警报
Bob - 2
Jim - 3
Tom
Bill
目前我正在按日期获取项目并按 userId 对它们进行分组,如下所示:
{
"USER_ID1":[
{
"SENDER_NAME":"JOHN",
"SHOWN":0
},
{
"SENDER_NAME":"JOHN",
"SHOWN":1
}
],
"USER_ID2":[
{
"SENDER_NAME":"BOB",
"SHOWN":0
},
{
"SENDER_NAME":"BOB",
"SHOWN":0
}
]...
}
这就是获取警报的位的工作方式
PFQuery *query = [PFQuery queryWithClassName:@"Alerts"];
[query whereKey:@"recipiantIds" equalTo:[[PFUser currentUser] objectId]];
[query orderByAscending:@"createdAt"];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
self.alerts = [NSMutableArray arrayWithArray:objects];
if (error) {
NSLog(@"Error: %@ %@", error, [error userInfo]);
[[[UIAlertView alloc] initWithTitle:@"Could not fetch alerts" message:@"Please check your internet connection" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil] show];
}
else {
for (PFObject *alert in objects) {
[self addAlert:alert[@"sender_name"] andShown:alert[@"shown"] andId:alert.objectId andSenderId:alert[@"senderId"] andDate:alert.createdAt];
}
[self.tableView reloadData];
}
}];
以及向字典添加提醒的功能:
- (void)addAlert:(NSString *)senderName andShown:(NSNumber*)shown andId:(NSString*)alertId andSenderId:(NSString*)senderId andDate:(NSDate *)date {
NSDictionary *items;
if (shown != nil) {
items = @{@"sender":senderName, @"shown":shown, @"alertid":alertId, @"senderId":senderId, @"datestamp":date};
}
else {
items = @{@"sender":senderName, @"alertid":alertId, @"senderId":senderId, @"datestamp":date};
}
if ([self.myalerts objectForKey:senderId] != nil) {
NSMutableArray *userAlerts = [self.myalerts objectForKey:senderId];
[userAlerts addObject:items];
[self.myalerts setObject:userAlerts forKey:senderId];
}
else {
NSMutableArray *userAlerts = [NSMutableArray new];
[userAlerts addObject:items];
[self.myalerts setObject:userAlerts forKey:senderId];
}
}
如果有什么好方法可以像 SnapChat 那样对它们进行排序,我很想知道。
谢谢大家!
最佳答案
是的,这是可以做到的。您需要使用 NSSortDescriptor
对警报数组进行排序(键是您要排序的对象中的任何键):
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"SENDER_NAME" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:descriptor];
NSArray *sortedArray = [objects sortedArrayUsingDescriptors:sortDescriptors];
更新
好吧,如果你想像 snapchat 那样订购它,你需要在这里使用混合方法。我不会详细说明整个算法,但它可能是这样的:
1) 创建一个新数组来保存新排序的通知
2) 遍历对象数组并将所有未读通知移动到您在第一步中创建的数组
3) 按时间对您在第一步中创建的数组进行排序(见下文)
4) 按时间对对象数组中的其余对象进行排序(见下文)
5) 将刚刚排序的对象添加到新数组中
按时间排序(与原答案非常相似):
NSSortDescriptor *dateDescriptor = [NSSortDescriptor
sortDescriptorWithKey:@"date"
ascending:NO];
NSArray *sortDescriptors = [NSArray arrayWithObject:dateDescriptor];
NSArray *sortedEventArray = [nodeEventArray
sortedArrayUsingDescriptors:sortDescriptors];
关于ios - 如何按用户对 PFObjects 进行分组,然后对它们进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29578912/