NSSortDescriptor 可以使用部分键进行排序吗?

Posted

技术标签:

【中文标题】NSSortDescriptor 可以使用部分键进行排序吗?【英文标题】:NSSortDescriptor sorting with part of key possible? 【发布时间】:2011-02-19 07:48:11 【问题描述】:

我有一个 CoreData iphone 应用程序,它有一个显示地址的视图。

地址如下所示:“5 Blob Street, 2222, Suburbia”,其中“5 Blob Street”是 address_and_number 键,“2222”是邮政编码,“Suburbia”是郊区。

目前我使用这个 NSSortDescriptor,效果很好:

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] 
                                    initWithKey:@"address_and_number" ascending:YES];

但是,我的客户想要按街道名称进行排序,即从 address_and_number 键中,将评估“Blob Street”。

有没有办法在不将 address_and_number 键分成两个键“address”和“number”的情况下进行这种排序?

我是否可以使用正则表达式仅获取我需要进行排序的 address_and_number 键的一部分,并以某种方式将其添加到 NSSortDescriptor 对象中?

【问题讨论】:

也许 NSComparator 会有用? 也许这是相关的:***.com/questions/3455512/… 【参考方案1】:

根据Custom sorting using categories and core data - is it supported by the framework?相关问题的回答

NSFetchedResultsController 内部的排序是在持久存储级别执行的,因此如果您使用 SQLite 作为后端,它将失败。

对于这样的事情,我会去规范化数据并存储月份和日期以及实际出生日期,以便您可以对它们进行排序。

在尝试了选择器和比较器后,我使用 sqlite3 的持久级别都没有,我将 address_and_number 键拆分为 address_street_name 和 address_street_number 键,然后按 address_street_name 排序。

【讨论】:

【参考方案2】:

尝试像这样在 NSSortDescriptor 的初始化中添加一个 NSComparator 块:

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]
                                    initWithKey:@"Address_suburb" ascending:YES comparator:^NSComparisonResult(id obj1, id obj2) 
                                      // do your comparison without house numbers here
                                      // return either NSOrderedAscending, NSOrderedDescending or NSOrderedSame
                                    ];

【讨论】:

当持久层是 sqlite3 时,这显然不起作用。我的情况是这样。

以上是关于NSSortDescriptor 可以使用部分键进行排序吗?的主要内容,如果未能解决你的问题,请参考以下文章

NSSortDescriptor 与关系

当第一个描述符是 NSDate 时,多个 NSSortDescriptor 不起作用

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

创建 NSSortDescriptor

你可以在 NSSortDescriptor: sortDescriptorWithKey: 的关键参数中使用点符号吗?

核心数据 - 可以使用 NSSortDescriptor 中的块对 TableView 进行排序吗?