谓词中的逻辑运算符是否与NSFetchRequest短路?

时间:2018-01-08 10:47:29

标签: ios core-data

我有NSPredicate使用逻辑OR运算符,如下所示:

NSPredicate(format: "activeFrom == NULL OR %@ >= activeFrom", someDate)

当我使用此谓词从CoreData获取结果时,使用NSFetchRequest,评估是否已短路,以便在第一个子句的计算结果为true时不评估第二个子句?

Apple似乎已经实施了合理的优化,但我无法在文档中找到任何正式的内容来确认。

1 个答案:

答案 0 :(得分:2)

来自Core Data Programming Guide,效果部分:

  

获取谓词

     

如何使用谓词会显着影响应用程序的性能。如果获取请求需要复合谓词,则可以通过确保最严格的谓词是第一个来使提取更有效,特别是如果谓词涉及文本匹配(contains,endsWith,like和matches)。正确的Unicode搜索很慢。如果谓词结合了文本和非文本比较,则首先指定非文本谓词可能更有效;例如,(salary> 5000000)AND(lastName LIKE' Quincey')优于(lastName LIKE' Quincey')AND(salary> 5000000)。有关创建谓词的更多信息,请参阅谓词编程指南。

所以,是的,似乎对谓词的评估已经按照您的预期进行了优化。其中大部分将取决于SQLite如何优化相应的WHERE子句(假设您使用的是SQLite存储)。