2010-02-18 2 views
3

본질적으로 트리 스타일 그래프를 구성하는 객체 배열을 필터링하려고합니다. 내가 원하는 일은 visible 속성이 NO이거나 parent/grandparent/etc visible 속성이 true 인 모든 객체를 필터링하는 것입니다 (자식 객체는 visible 속성을 가질 수 있지만 부모는 NO가 될 수 있습니다).객체 그래프를 재귀 적으로 통과 할 수있는 NSPredicate?

부모가 없거나 보이는 속성이 발견 될 때까지 부모 노드를 계속 검색하기 위해 NSPredicate 구문을 사용하는 방법에 대해 잘 모르겠습니다. 이 문제를 해결할 방법이 있습니까?

답변

1

그 오랜만, 나는 내가 무엇을하고 있었는지와 다른 방향으로 갔다 생각하지만 난 시간에 원하는 것을 해결하기 위해 내가 지금 실현 몇 가지 가능성이 있습니다 :

  • 은 visible 속성 메서드가 형식 술어를 만드는 대신 재귀 적으로 작동하도록하십시오. 이과 같이 수행 할 수 있습니다 :
[array filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) { 

    id obj = evaluatedObject; 
    while (obj) { 
     if (![obj isVisible]) return NO; 
     obj = [obj parent]; 
    } 
    return YES; 
}]]; 

또는 : 대신 형식의

- (BOOL) isVisible { 
    return visible && [parent isVisible]; 
} 

//... 
id filtered = [array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"visible == YES"]]; 
  • 사용 블록 술어는 재귀 탐색을 수행하는 술어 조합의 두 가지 (내가 생각하는 가장 견고하고 읽을 수있을 것입니다).

0

단순한 단일 술어로 할 수있는 작업이 무엇인지 확신 할 수 없습니다. 트리이고 노드를 가져 오기 위해 조건자를 사용하는 경우 위쪽으로 트래버스하는 메서드를 작성하여 제거할지 여부를 나타내는 BOOL을 반환합니다.

그런 다음, 당신의 노드를 취득하고있는 NSMutableArray에 넣어와

for (int i = 0; i < [results count]; i++) 
{ 
    if ([self shouldBeRemoved:[results objectAtIndex:i]]) 
    { 
     [results removeObjectAtIndex:i]; 
     i--; 
    } 
} 

귀하의 shouldBeRemoved 수행 방법은 매우 간단 재귀 방법이어야한다. 나는이 질문을하기 때문에

관련 문제