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

标签 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 那样对它们进行排序,我很想知道。

谢谢大家!

最佳答案

是的,这是可以做到的。您需要使用 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/

相关文章:

iphone - 如何在url中使用变量

iphone - iOS 6 模拟器键盘没有响应

iphone - MPMoviePlayerViewController 方向

iphone - 如何在点击时显示和隐藏按钮标题

iOS7 viewController 和 MPMoviePlayerViewController 旋转

iphone - 在 iOS 中提取 MP3 专辑插图

objective-c - 如何计算plist中的项目

iphone - NSString 删除字符串中的单引号

ios - 按下时突出显示的UIButton不会在第一次按下时突出显示

objective-c - 使用 ARC 绘制渐变时 CFArrayRef 和 NSArray 出现问题