-(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;
}
哪一个更好?
NSPredicate * final = [NSCompoundPredicate andPredicateWithSubpredicates:@[predictNameMatch,entryTypeNameMatch]];
或
NSPredicate * final = [NSCompoundPredicate andPredicateWithSubpredicates:@[entryTypeNameMatch,predictNameMatch]];
这里,predictNameMatch肯定是限制性更强。最多1-2个是完全匹配。 entryTypeName匹配匹配25%的数据。
答案 0 :(得分:2)
如果重要,请测试并测量它。
我怀疑一般 Martin R是正确的,但性能优化是一种黑暗艺术,唯一可以确定的方法是找出...
答案 1 :(得分:1)
我不能给你准确的参考,因为我在手机上写这个,但我相当确定在一些WWDC核心数据会议上建议首先放置最严格的谓词。
答案 2 :(得分:1)
最严格的谓词应该是第一位的。在像这样的复合谓词中,谓词从左到右进行计算,一旦结果已知,处理就结束。在你的情况下,你有一个逻辑AND,所以如果第一个谓词是假,第二个谓词将被跳过(因为它是不必要的)。所以,如果第一个谓词几乎没有任何匹配,那么你几乎不需要评估第二个谓词。
它与if
条件中发生的快捷方式完全相同。如果您使用if (a && b)
,并且a
为false,则不会评估b
。