如何按用户分组PFObject,然后对它们进行排序?

时间:2015-04-11 14:18:12

标签: ios objective-c iphone sorting parse-platform

我目前正在使用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那样对它们进行排序,我很乐意知道它。

谢谢你们!

1 个答案:

答案 0 :(得分:1)

是的,这可以做到。您希望使用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];