Pregunta

Estoy intentando filtrar un conjunto de objetos que forman esencialmente un gráfico en forma de árbol. lo que quiero hacer es filtrar todos los objetos de este conjunto cuya propiedad visible es no, o si su padre / abuelo / etc propiedad visible es verdadera (objetos secundarios pueden tener la propiedad visible sea sí, mientras que su padre puede ser NA).

Estoy claro cómo iba a ir sobre esta sintaxis NSPredicate usando a seguir buscando el nodo padre hasta que no haya padres o la propiedad visible se encuentra. ¿Hay alguna manera de hacer esto?

¿Fue útil?

Solución

Ha sido un tiempo desde que hice esta pregunta, y creo que fui en otra dirección, con lo que estaba haciendo, pero hay algunas posibilidades Me doy cuenta ahora de resolver lo que quería en ese momento:

  • Haga que el método de propiedad visible se comportan de forma recursiva en vez de hacer el predicado formato de hacer eso. Esto se podría conseguir de esta manera:
- (BOOL) isVisible {
  return visible && [parent isVisible];
}

//...
id filtered = [array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"visible == YES"]];
  • predicados uso de bloques en lugar de formato de predicados para hacer el recorrido recursivo:
[array filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {

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

O una combinación de los dos (lo que sería el más robusto y fácil de leer, creo).

Otros consejos

No estoy seguro de lo que estás tratando de hacer es posible con una única y simple predicado. Si se trata de un árbol y está utilizando un predicado para obtener los nodos, que le quiere y escribe un método que va a recorrer hacia arriba y devolver un BOOL que indica si se debe quitar o no.

A continuación, acaba de obtener sus nodos y ponerlos en un NSMutableArray y hacer un

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

Su shouldBeRemoved:. Método debe ser bastante un método recursivo directo

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top