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:,但我认为这不会比您的循环快。