Ios 集合元素匹配谓词的存在性检验
我有办法Ios 集合元素匹配谓词的存在性检验,ios,objective-c,Ios,Objective C,我有办法 - (BOOL)isLockedDueToSamples { if ([self.samples count] > 0) { NSPredicate* p = [NSPredicate predicateWithFormat:@"appraised == YES OR analysed == YES"]; if ([[self.samples filteredSetUsingPredicate:p] count] > 0)
- (BOOL)isLockedDueToSamples
{
if ([self.samples count] > 0)
{
NSPredicate* p = [NSPredicate predicateWithFormat:@"appraised == YES OR analysed == YES"];
if ([[self.samples filteredSetUsingPredicate:p] count] > 0)
return YES;
}
return NO;
}
此方法需要非常频繁地调用,但速度非常慢,因为self.samples最多可调用1500个。是否有一种技术可以检查是否存在与谓词匹配的集合元素,而不必过滤整个集合
编辑:
我已经设法使这个方法像这样稍微快一点
- (BOOL)isLockedDueToSamples
{
if ([self.samples count] > 0)
{
for (Sample *sample in self.samples)
{
if (sample.appraised || sample.analysed)
{
return YES;
}
}
}
return NO;
}
如果性能有问题,您可以异步执行筛选,或者使用的方法,将一个块传递给它进行测试,并在遇到阳性测试时停止:
- (BOOL)isLockedDueToSamples
{
NSSet* matches = [self.samples objectsPassingTest:^(id sample, BOOL* stop){
if (sample.appraised || sample.analysed) {
*stop = YES;
return YES;
}
}];
return [matches count] > 0;
}
编辑:
但是,我认为这不会比for循环快。您可以尝试objectsPassingTest:,但我认为这不会比您的循环快。