花了几个小时后,我发现无法在以下文章中由 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
的前三个字符与用户输入的内容完全匹配。
可能的想法:
- 将 NSFetchedResultsController 的结果复制到 NSArray 中并进行自定义排序。 我不确定 NSArray 对于像英语字典这样的大型数组来说有多快。
- 多次尝试执行Fetch。例如上面的例子,尝试按顺序执行
bre.*
、br.+e.*
、b.+r.+e.*
的performFetch并将它们组合起来。
这两个想法看起来都不太简洁。
如果您能为此类问题提出任何已知的简洁且典型的解决方案,我将不胜感激。
最佳答案
您可以考虑的另一种方法是使用 transient 属性来装饰结果以指示匹配类型,然后使用该 transient 属性作为第一个排序描述符。
这需要循环遍历所有结果,再次比较字符串,并设置属性。如果您期望得到一长组结果,使用数组可能同样简单。
如果您需要有效地处理大型结果集,我建议使用两种排序描述符,一种仅返回精确匹配,另一种仅返回非精确匹配。然后显示第一个结果,然后显示第二个结果。使用复合谓词应该可以完成。
关于iphone - NSFetchedResultsController 中的自定义排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7782024/