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]];