我有一个方法
- (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;
}
答案 0 :(得分:0)
如果性能是一个问题,你可以异步进行过滤,或者使用NSSet
的objectsPassingTest:
方法,传递一个块进行测试,并在遇到肯定测试时停止:
- (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循环更快。