iphone - NSFetchedResultsController 中的自定义排序

标签 iphone sorting nsfetchedresultscontroller nssortdescriptor

花了几个小时后,我发现无法在以下文章中由 SQLite 支持的 NSFetchedResultsController 中进行自定义排序。

NSFetchedResultsController custom sort not getting called

但是,我找不到解决我的问题的实际解决方案。

这就是我正在尝试做的事情。

背景:
我在 CoreData 中有一个英语词典数据库(只是一个简单的单词列表 - 非常大)。使用 NSFetchedResultsController 在 UITableView 中显示单词。

UITableView 有一个关联的搜索栏。当用户在搜索栏中输入字符串时,UITableView 会显示过滤后的单词列表。

为什么我需要自定义排序:
当用户输入一个字符串时,假设它是 bre,我将其更改为正则表达式 b.*r.*e.* 并将其用作 NSPredicate,然后,执行performFetch。这样所有像“bare”和“break”这样的词都会显示在表格 View 中。

默认情况下,单词按字母顺序显示。因此,bare 将出现在 break 之前。

我希望 break 位于搜索列表中的 bare 之前,因为 break 的前三个字符与用户输入的内容完全匹配。

可能的想法:

  1. 将 NSFetchedResultsController 的结果复制到 NSArray 中并进行自定义排序。 我不确定 NSArray 对于像英语字典这样的大型数组来说有多快。
  2. 多次尝试执行Fetch。例如上面的例子,尝试按顺序执行bre.*br.+e.*b.+r.+e.*的performFetch并将它们组合起来。

这两个想法看起来都不太简洁。

如果您能为此类问题提出任何已知的简洁且典型的解决方案,我将不胜感激。

最佳答案

您可以考虑的另一种方法是使用 transient 属性来装饰结果以指示匹配类型,然后使用该 transient 属性作为第一个排序描述符。

这需要循环遍历所有结果,再次比较字符串,并设置属性。如果您期望得到一长组结果,使用数组可能同样简单。

如果您需要有效地处理大型结果集,我建议使用两种排序描述符,一种仅返回精确匹配,另一种仅返回非精确匹配。然后显示第一个结果,然后显示第二个结果。使用复合谓词应该可以完成。

关于iphone - NSFetchedResultsController 中的自定义排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7782024/

相关文章:

iphone - 如何让iPhone应用程序多次要求注册设备以进行推送通知

javascript - 使用 javascript 按组成的字母表手动对段落进行排序

sql - sas sql 第一个 obs 最后一个 obs

ios - 通过两个不同的带部分的 NSFetchedResultsControllers 的单 TableView

ios - 无法推断复杂的闭包返回类型;添加显式类型以消除歧义

iphone - ios 解析问题 nstimer 教程

iphone - 如何减慢UIPanGestureRecognizer的速度?

objective-c - AudioKit 滚动波形图未显示在物理设备上

asp.net-mvc - ASP.NET MVC - Model.OrderBy Date 没有效果

iphone - 后台删除在启动后不起作用