Objective c 在核心数据中,我应该首先使用限制性更强的谓词还是限制性更小的谓词?

Objective c 在核心数据中,我应该首先使用限制性更强的谓词还是限制性更小的谓词?,objective-c,core-data,Objective C,Core Data,哪一个更好 -(NSPredicate *) predicateForExactMatch { enum typeOfAutocompleteNew toc = [[self class] typeOfAutoComplete]; NSPredicate * predictNameMatch=[NSPredicate predicateWithFormat:@"%K==[cd]%@",NSStringFromSelector(@selector(strNameofPlace)),

哪一个更好

-(NSPredicate *) predicateForExactMatch
{
    enum typeOfAutocompleteNew toc = [[self class] typeOfAutoComplete];
    NSPredicate * predictNameMatch=[NSPredicate predicateWithFormat:@"%K==[cd]%@",NSStringFromSelector(@selector(strNameofPlace)),self.strCurrentKeyword];
    NSPredicate * entryTypeNameMatch=[NSPredicate predicateWithFormat:@"%K==[cd]%@",NSStringFromSelector(@selector(strEntry)),@(toc)];
    NSPredicate * final = [NSCompoundPredicate andPredicateWithSubpredicates:@[predictNameMatch,entryTypeNameMatch]];
    return final;
}


在这里,predictNameMatch肯定要严格得多。最多1-2个是完全匹配的。entryTypeNameMatch匹配了25%的数据。

我不能给你确切的参考,因为我是在电话上写的,但我相当肯定,在某些WWDC核心数据会话中,建议首先使用限制性最强的谓词

我无法给出确切的参考,因为我是在电话上写的,但我相当肯定,在某个WWDC核心数据会话中,建议首先使用最严格的谓词

如果有问题,测试并测量它


我怀疑这通常是正确的,但性能优化是一门黑暗的艺术,唯一确定的方法是找出…

如果它重要,测试并测量它


我怀疑这通常是正确的,但性能优化是一门黑暗的艺术,唯一确定的方法是找出…

最严格的谓词应该放在第一位。在像这样的复合谓词中,谓词从左到右求值,一旦知道结果,处理就结束。在本例中,您有一个逻辑AND,因此如果第一个谓词为false,则将跳过第二个谓词(因为它是不必要的)。因此,如果第一个谓词几乎没有匹配项,则几乎不需要计算第二个谓词


这与
if
条件中发生的快捷方式完全相同。如果您正在使用
如果(a和&b)
,并且
a
为false,则不会对
b
进行求值。

最严格的谓词应排在第一位。在像这样的复合谓词中,谓词从左到右求值,一旦知道结果,处理就结束。在本例中,您有一个逻辑AND,因此如果第一个谓词为false,则将跳过第二个谓词(因为它是不必要的)。因此,如果第一个谓词几乎没有匹配项,则几乎不需要计算第二个谓词


这与
if
条件中发生的快捷方式完全相同。如果您使用
如果(a和&b)
,并且
a
为假,那么
b
将不会被评估。

我也这样认为。我需要一个能确定并解释原因的人。二级索引似乎不起作用,或者coredata没有复合索引。我也这么认为。我需要一个能确定并解释原因的人。二级索引似乎不起作用,或者coredata没有复合索引。如果有疑问,请询问堆栈溢出。如果有疑问,请询问堆栈溢出。
    NSPredicate * final = [NSCompoundPredicate andPredicateWithSubpredicates:@[predictNameMatch,entryTypeNameMatch]];
    NSPredicate * final = [NSCompoundPredicate andPredicateWithSubpredicates:@[entryTypeNameMatch,predictNameMatch]];