ios - 根据对象的内容对 NSMutableArray 进行排序

标签 ios objective-c

我有一个名为 self.objectArrayNSMutableArray,它包含自定义对象。每个对象都包含一个 NSDictionary 和另外两个字符串对象。实际上我只需要使用字典。每个字典都包含一个名为 keyDate 的键,它包含一个 NSString,如下所示:MM/dd/yy HH:mm:ss

我想根据它们的 keyDate 对数组进行排序。日期最早的对象应该是第一个对象,依此类推。我发现了一些看起来很有帮助的问题,我可以创建您可以在下面看到的代码,但每次运行它时都会出错。我认为 NSSortDescriptor 不是正确的工具,因为我的键不符合键值。

PNMessage 0x125c0590> valueForUndefinedKey:]: this class is not key value coding-compliant for the key keyDate.'

NSSortDescriptor *dateDescriptor = [NSSortDescriptor
                                    sortDescriptorWithKey:@"keyDate"
                                    ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:dateDescriptor];
NSArray *sortedEventArray = [self.objectArray
                             sortedArrayUsingDescriptors:sortDescriptors];

self.finallySorted = [sortedEventArray mutableCopy];

如果可能的话,我会用排序描述符来做,但我认为应该有一些其他的选择,但无法弄清楚它的正确实现。

所以我也可以用 for 循环捕获每个对象的 keyDate,但不知道如何根据值对它们进行排序。如果有人能告诉我正确的方法,我将不胜感激。

 for(PNMessage *mg in self.objectArray)

        {
           NSLog(@" test log %@", mg.message[@"keyDate"]);
        }

我已经检查过这个答案: How to sort an NSMutableArray with custom objects in it?

但我的对象的结构不同。

我的第一个代码基于这个问题,但是没有用。 How to sort an NSMutableArray with custom objects in it?

更新:我的尝试基于 Kaan 的回答(还没有用)

    static NSDateFormatter *formatter = nil;
if(!formatter) {
    formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"MM/dd/yy HH:mm:ss"];
}
NSArray *sortedArray = [self.object sortedArrayUsingComparator:^NSComparisonResult(PNMessage *obj1, PNMessage *obj2) {
    NSString *date1String = obj1.message[@"keyDate"];
    NSString *date2String = obj1.message[@"keyDate"];
    NSDate *date1 = [formatter dateFromString:date1String];
    NSDate *date2 = [formatter dateFromString:date2String];

    if ( date1 < date2 ) {
        return (NSComparisonResult)NSOrderedAscending;
    } else if ( date1 > date2 ) {
        return (NSComparisonResult)NSOrderedDescending;
    }
    return (NSComparisonResult)NSOrderedSame;
}];

最佳答案

我会考虑使用 sortedArrayUsingComparator 方法

假设您的自定义类称为 PNMessage:

static NSDateFormatter *formatter = nil;
if(!formatter) {
formatter = [[NSDateFormatter alloc] init];
[formatter setFormat:@"MM/dd/yy HH:mm:ss"];
}
NSArray *sortedArray = [self.objectArray sortedArrayUsingComparator:^NSComparisonResult(PNMessage *obj1, PNMessage *obj2) {
    NSString *date1String = obj1[@"keyDate"];
    NSString *date2String = obj1[@"keyDate"];
    NSDate *date1 = [formatter dateFromString:date1String];
    NSDate *date2 = [formatter dateFromString:date2String];

    return [date1 compare:date2];
}];

提示:如果您决定遵循这一点,请确保在排序主体之外将您的 NSDateFormatter 实例声明为静态的,因为在 iOS 中分配 Formatters 可能非常昂贵并且会导致严重的性能损失。

关于ios - 根据对象的内容对 NSMutableArray 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24614549/

相关文章:

ios - 在 Swift 中将 NSMutableData 转换为 NSString

ios - 释放单例

ios - 如何调用 'popoverControllerDidDismissPopover'方法?

ios - iMessage 应用程序视频消息音量不起作用

ios - 如何在 AppDelegate 之外处理 UIApplicationDidRegisterToRemoteNoticationsWithDeviceToken?

ios - UICollectionView 滚动到任何页脚或页眉 View

objective-c - 桥接头问题,在设备上运行时缺少头文件

ios - UINavigationBar setItems/pushNavigationItem/popNavigationItem 的自定义动画?

ios - Sprite Kit 创建动画对象

ios - 来自 NSArray 的 NSMutableArray