检查set元素匹配谓词的存在性

时间:2013-12-24 02:04:12

标签: 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)
            return YES;
    }
    return NO;
}

此方法需要经常调用,但速度很慢,因为self.samples最多可以达到1500.是否有一种技术可以检查是否存在与谓词匹配的set元素而无需过滤整个集合?< / p>

编辑:

我设法让这个方法稍快一点

- (BOOL)isLockedDueToSamples
{
    if ([self.samples count] > 0)
    {
        for (Sample *sample in self.samples)
        {
            if (sample.appraised || sample.analysed)
            {
                return YES;
            }
        }
    }
    return NO;
}

1 个答案:

答案 0 :(得分:0)

如果性能是一个问题,你可以异步进行过滤,或者使用NSSetobjectsPassingTest:方法,传递一个块进行测试,并在遇到肯定测试时停止:

- (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循环更快。