Frage

Ich versuche, ein Array von Objekten zu filtern, die im wesentlichen aus einem Baum-Stil Diagramm bilden. was ich will, ist, tun alle Objekte aus diesem Array, um herauszufiltern, deren sichtbare Eigenschaft NEIN ist, oder wenn ihre Eltern / Großeltern / etc sichtbar Eigenschaft true ist (Kind-Objekte können die sichtbare Eigenschaft haben ja sein, während seine Eltern NO sein kann).

Ich bin unklar, wie ich über diese mit NSPredicate Syntax gehen würde zu halten den übergeordneten Knoten suchen, bis es keine Eltern oder die sichtbare Eigenschaft gefunden wird. Gibt es eine Möglichkeit, um dies zu?

War es hilfreich?

Lösung

Es ist schon eine Weile her, seit ich diese Frage gestellt, und ich glaube, ich in einer anderen Richtung ging mit dem, was ich tat, aber es gibt einige Möglichkeiten, die ich jetzt erkennen, zu lösen, was ich damals wollte:

  • Haben Sie die Eigenschaft visible Methode verhalten rekursiv statt das Format Prädikat machen tun. Dies könnte wie so erreicht werden:
- (BOOL) isVisible {
  return visible && [parent isVisible];
}

//...
id filtered = [array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"visible == YES"]];
  • Verwenden Block Prädikate anstelle von Format Prädikaten der rekursive Traversal zu tun:
[array filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {

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

oder eine Kombination der beiden (die die robusteste wäre und lesbar glaube ich).

Andere Tipps

Ich bin nicht sicher, was Sie suchen zu tun ist möglich, mit einem einfachen, einzigen Prädikat. Wenn es ein Baum ist und Sie verwenden ein Prädikat, um die Knoten zu bekommen, würden Sie wollen, und ein Verfahren schreiben, die nach oben durchlaufen werden und ein BOOL Rückkehr der angibt, ob es entfernt werden soll oder nicht.

Dann einfach Ihre Knoten erhalten und sie in einem NSMutableArray und machen Sie einen

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

Ihre shouldBeRemoved. Methode sollte ziemlich eine einfache rekursive Methode sein

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top