假设我有一个用于NSPredicate
规则的核心数据数据库。
enum PredicateType,Int {
case beginswith
case endswith
case contains
}
我的数据库如下所示
+------+-----------+
| Type | Content |
+------+-----------+
| 0 | Hello |
| 1 | end |
| 2 | somevalue |
| 0 | end |
+------+-----------+
我有一个内容“这就是结束”。如何查询核心数据,查看是否有满足该内容的规则?它应该在表中找到第二个条目
+------+-----------+
| Type | Content |
+------+-----------+
| 1 | end |
+------+-----------+
但不应该找到
+------+-----------+
| Type | Content |
+------+-----------+
| 0 | end |
+------+-----------+
因为在这个句子中,end
不是在开头。
目前我正在获取所有的值,使用Content和Type创建谓词,然后再次查询数据库,我认为这是一个很大的开销。
发布于 2017-07-06 14:29:22
他们现在做这件事的方式是正确的。您首先需要构建谓词(在本例中,这是一个非常复杂的操作,还需要获取),并运行每个谓词,看看哪个匹配。
我不会这么快就认为这会带来巨大的开销。如果你的数据集很小(<300),我会怀疑这根本不会有问题。如果你遇到了问题(也只有在那时!)你应该开始优化了。
如果你发现应用程序运行太慢,那么使用instrements来查看问题所在。我可以看到有两个可能存在性能问题的地方- 1)从数据库获取所有谓词和2)所有谓词的运行。
如果你想让抓取速度更快,那么我建议你使用NSFetchedResultsController
。虽然它通常用于保持数据与表视图的同步,但它也可以用于任何您希望在任何时候具有正确数据的数据。使用控制器,您只需执行一次获取操作,然后它就会监控核心数据,并使自己保持与数据同步。然后,当您需要所有谓词而不是执行fetch时,只需访问控制程序的fetchedObjects
属性。
如果您发现运行所有谓词都需要很长时间,那么您可以通过巧妙地使用二元搜索来提高beginsWith和endsWith的运行速度。您保留了两个自定义谓词对象数组,一个按字母顺序排序,另一个按字母顺序排序。要查找它以哪个字符串开头,请使用indexOfObject:inSortedRange:options:usingComparator:
查找相关的对象。如果不知道如何改进包含。您可以看到在对象上运行string方法是否比运行NSPredicate方法更快。您还可以尝试在后台线程上并发运行谓词。
同样,您不应该这样做,除非您发现您需要这样做。如果您的数据集很小,那么您现在使用的方法就很好。
https://stackoverflow.com/questions/44927335
复制相似问题