NSSortDescriptor 未正确排序整数

Posted

技术标签:

【中文标题】NSSortDescriptor 未正确排序整数【英文标题】:NSSortDescriptor not sorting integers correctly 【发布时间】:2012-03-27 22:13:18 【问题描述】:

我正在尝试按日期然后开始时间排序。开始时间是从午夜开始的几分钟。因此,如果开始时间

- (NSFetchedResultsController *)fetchedResultsController 

    if (fetchedResultsController != nil) 
        return fetchedResultsController;
    

    /*
     Set up the fetched results controller.
     */
    // Create the fetch request for the entity.
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    // Edit the entity name as appropriate.
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Appointments" inManagedObjectContext:[[DataManager sharedInstance] managedObjectContext]];
    [fetchRequest setEntity:entity];
    [fetchRequest setIncludesPendingChanges:YES];

    // Set the batch size to a suitable number.
    //[fetchRequest setFetchBatchSize:20];

    // Sort using the date / then time property.
    NSSortDescriptor *sortDescriptorDate = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:YES];
    NSSortDescriptor *sortDescriptorTime = [[NSSortDescriptor alloc] initWithKey:@"start_time" ascending:YES];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptorDate, sortDescriptorTime, nil];


    [fetchRequest setSortDescriptors:sortDescriptors];

    // Use the sectionIdentifier property to group into sections.
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[[DataManager sharedInstance] managedObjectContext] sectionNameKeyPath:@"date" cacheName:@"List"];
    aFetchedResultsController.delegate = self;
    self.fetchedResultsController = aFetchedResultsController;
    NSLog(@"FetchedController: %@", fetchedResultsController);
    return fetchedResultsController;

我怎样才能正确地对整数进行排序?

【问题讨论】:

希望您的 start_time(在您的核心数据对象模型中)是 NSNumber 对象而不是字符串。 【参考方案1】:

如果 start_time 是一个字符串,那么它将按字母顺序排序,这意味着 aab 之前,这也意味着 112 之前。

要以更人性化的方式进行排序,请使用NSStringlocalizedStandardCompare: 作为选择器。

[NSSortDescriptor sortDescriptorWithKey:@"start_time" ascending:YES selector:@selector(localizedStandardCompare:)]

【讨论】:

就是这样!谢谢。我将它作为字符串保存在我的核心数据中,因为它来自 API 作为字符串而不是数字。 这太棒了。正是我想要的。我遇到了我的字符串列以这种方式排序的问题 1,10,11,2,3,4... 上面的解决方案解决了它。 NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"dateTimeInSec" 升序:YES 选择器:@selector(localizedStandardCompare:)];崩溃了我的应用程序。 start_time 是 NSString 类型属性还是 NSNumber?错误是 -[__NSCFNumberlocalizedStandardCompare:]:无法识别的选择器发送到实例 0x16dc40c0 和 userInfo (null)

以上是关于NSSortDescriptor 未正确排序整数的主要内容,如果未能解决你的问题,请参考以下文章

核心数据和 NSSortDescriptor 未根据基于 NSString 的第三个描述符排序

使用两个 NSSortDescriptor 过滤数组

NSSortDescriptor 不起作用

如何使用 Fetch Result Controller 正确添加附加部分?

具有任意排序的 NSSortDescriptor

NSSortDescriptor 不排序 NSArray