2010-05-10 90 views
1

我正在开发我的第一个iPhone应用程序,并且我碰到了一堵墙。我正在尝试为三个实体关系开发一个“统计”页面。我的实体如下:可可核心数据 - 有效的相关实体计数

部 - 姓名,地址,建筑物等 人 - 姓名,性别(BOOL),电话等

如果我已经赚得了一个专门的部门如何过滤这些结果并且只返回男性(性别== 0)的人?

如果我做

NSLog(@"%d", [department.people count]); 

我得到人们的正确数量在该部门,所以我知道我在附近。我知道每次我都可以重新获取并修改谓词,但是在我的应用中有20多个统计数据,效率似乎很低。感谢您的任何建议!

回答

1

你不需要重新获取:

NSPredicate* pred = [NSPredicate predicateWithFormat:@"gender == NO"]; 
NSUInteger count = [[department.people filteredArrayUsingPredicate:pred] count]; 
NSLog(@"%lu", (unsigned long)count); 

不知何故gender==NO仍然看起来很奇怪,虽然;)

如果复制是太贵了,你可以使用枚举来代替。例如: -

NSUInteger CountIf(NSEnumerator* en, NSPredicate* pred) { 
    NSUInteger count = 0; 
    id obj; 
    while (obj = [en nextObject]) { 
     if([pred evaluateWithObject:obj]) 
      ++count; 
    } 
    return count; 
} 

NSUInteger count = CountIf([department.people objectEnumerator], predicate)); 

...虽然这将是理想的移动到合适的类别如说countOfObjectsMatchingPredicate:

+0

格奥尔格,非常感谢。完善。 – Dolbex 2010-05-10 20:55:41

0

您可以创建代表您的不同过滤器的NSPredicate,并使用NSSetfilteredSetWithPredicate:方法。 count方法将为您提供匹配谓词的实体的数量。这并不是非常有效,因为您要为每次计算创建一个新的集合,但它可能比每次提取要快得多。