2010-05-10 7 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

0

다른 필터를 나타내는 NSPredicate을 만들고 NSSetfilteredSetWithPredicate: 방법을 사용할 수 있습니다. count 메소드는 술어와 일치하는 엔티티의 수를 알려줍니다. 이것은 각 계산에 대해 새로운 세트를 작성하기 때문에 대단히 효율적이지는 않지만 매번 페치하는 것보다 훨씬 빠를 수 있습니다.

관련 문제