我有NSPredicate
使用逻辑OR运算符,如下所示:
NSPredicate(format: "activeFrom == NULL OR %@ >= activeFrom", someDate)
当我使用此谓词从CoreData获取结果时,使用NSFetchRequest
,评估是否已短路,以便在第一个子句的计算结果为true时不评估第二个子句?
Apple似乎已经实施了合理的优化,但我无法在文档中找到任何正式的内容来确认。
答案 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存储)。