首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用NSPredicate引用其他NSPredicate规则

使用NSPredicate引用其他NSPredicate规则
EN

Stack Overflow用户
提问于 2017-07-05 21:14:51
回答 1查看 129关注 0票数 0

假设我有一个用于NSPredicate规则的核心数据数据库。

代码语言:javascript
运行
复制
enum PredicateType,Int {
case beginswith
case endswith
case contains
}

我的数据库如下所示

代码语言:javascript
运行
复制
+------+-----------+
| Type |  Content  |
+------+-----------+
|    0 | Hello     |
|    1 | end       |
|    2 | somevalue |
|    0 | end       |
+------+-----------+

我有一个内容“这就是结束”。如何查询核心数据,查看是否有满足该内容的规则?它应该在表中找到第二个条目

代码语言:javascript
运行
复制
+------+-----------+
| Type |  Content  |
+------+-----------+
|    1 | end       |
+------+-----------+

但不应该找到

代码语言:javascript
运行
复制
+------+-----------+
| Type |  Content  |
+------+-----------+
|    0 | end       |
+------+-----------+

因为在这个句子中,end不是在开头。

目前我正在获取所有的值,使用Content和Type创建谓词,然后再次查询数据库,我认为这是一个很大的开销。

EN

回答 1

Stack Overflow用户

发布于 2017-07-06 14:29:22

他们现在做这件事的方式是正确的。您首先需要构建谓词(在本例中,这是一个非常复杂的操作,还需要获取),并运行每个谓词,看看哪个匹配。

我不会这么快就认为这会带来巨大的开销。如果你的数据集很小(<300),我会怀疑这根本不会有问题。如果你遇到了问题(也只有在那时!)你应该开始优化了。

如果你发现应用程序运行太慢,那么使用instrements来查看问题所在。我可以看到有两个可能存在性能问题的地方- 1)从数据库获取所有谓词和2)所有谓词的运行。

如果你想让抓取速度更快,那么我建议你使用NSFetchedResultsController。虽然它通常用于保持数据与表视图的同步,但它也可以用于任何您希望在任何时候具有正确数据的数据。使用控制器,您只需执行一次获取操作,然后它就会监控核心数据,并使自己保持与数据同步。然后,当您需要所有谓词而不是执行fetch时,只需访问控制程序的fetchedObjects属性。

如果您发现运行所有谓词都需要很长时间,那么您可以通过巧妙地使用二元搜索来提高beginsWith和endsWith的运行速度。您保留了两个自定义谓词对象数组,一个按字母顺序排序,另一个按字母顺序排序。要查找它以哪个字符串开头,请使用indexOfObject:inSortedRange:options:usingComparator:查找相关的对象。如果不知道如何改进包含。您可以看到在对象上运行string方法是否比运行NSPredicate方法更快。您还可以尝试在后台线程上并发运行谓词。

同样,您不应该这样做,除非您发现您需要这样做。如果您的数据集很小,那么您现在使用的方法就很好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44927335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档