[英]How can I group PFObjects by User and then Sort them?
我目前正在使用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];
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.