2012-08-02 12 views
6

que tienen una lista de imágenes en el paquete de aplicación y la necesidad de mostrar los apropiados en aplicación, la imagen tiene el formato:NSPredicate: ¿cómo hacer NOT EndsWith?

###_photo_#.jpg 

###: toy id, from 1000 to 2000 
#: photo id, from 1 

así por ejemplo

1000_photo_1.jpg 
1000_photo_2.jpg 

que utiliza para obtener la lista de archivos en el paquete y usar un predicado para filtrar otros archivos:

@"self ENDSWITH '.jpg' AND self BEGINSWITH '%d_photo_'", toyId 

pero ahora hay imágenes de la retina que terminan con @ 2x.jpg, por lo que este método t necesitar o ser fijo, estoy pensando en agregar:

NOT ENDSWITH '@2x.jpg' 

pero ¿es esto correcto? debería decir:

NOT (ENDSWITH '@2x.jpg') 

o:

(NOT ENDSWITH '@2x.jpg') 

en su lugar?

+2

¿Por qué no puedes usar predicateWithBlock? – Jessedc

Respuesta

1

Creo que una mejor opción en iOS 4.0+ es usar NSPredicate predicateWithBlock: para definir sus condiciones. De esta forma, puede usar las funciones estándar de NSString como hasSuffix: para verificar sus extremos con caso negativo.

Pedido un buen tutorial aquí: http://www.wannabegeek.com/?p=149

Aquí está una manera básica se podría utilizar.

NSInteger toyId = 10; 
NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) { 
    return [evaluatedObject hasSuffix:@".jpg"] && 
    ![evaluatedObject hasSuffix:@"@2x.jpg"] && 
    [evaluatedObject hasPrefix:[NSString stringWithFormat:@"%@_photo_", [NSNumber numberWithInt:toyId]]]; 
}]; 

Luego, puede apoderarse de su gama de archivos

[arrayOfFiles filterArrayUsingPredicate:predicate]; 
+0

Pero 'predicateWithBlock' no funciona con la tienda de SQLite, ¿verdad? Si usa el almacén de SQLite, debe proporcionar una cadena de formato para el predicado. – BallpointBen

8

Puede utilizar una cadena de predicados como esto:

@"(self ENDSWITH '.jpg') AND NOT (self ENDSWITH '@2x.jpg') AND (self BEGINSWITH '%d_photo_')" 
+0

Creo que esta respuesta es mucho más simple que un predicateWithBlock. Claro, si necesita hacer otras cosas, el predicateWithBlock es el camino a seguir, pero simplemente para tener una condición NOT, ¡la cadena de predicados entre paréntesis es la solución correcta! – ericWasTaken

+0

Cada uno tiene ventajas y desventajas. La principal ventaja de mi respuesta, que no se aplica a la situación de hzxu, es que Core Data puede convertirla en la cláusula WHERE de una consulta de base de datos (posiblemente usando un índice). Core Data no puede hacer eso con un predicado de bloque. –

5

Puede encapsular un predicado en otro predicado:

NSPredicate *positivePredicate = [NSPredicate ...]; 
NSPredicate *negativePredicate = [NSCompoundPredicate notPredicateWithSubpredicate: positivePredicate]; 

T Esto le permite conservar la cadena de formato legible existente. Tenga en cuenta que con NSCompoundPredicate, también puede construir predicados AND y OR. A partir de estos tres (AND, OR, NOT), incluso se puede deducir cosas como XNOR y predicados NAND (a pesar de cómo hacerlo es un ejercicio deja al lector ...)

1

Prueba esto:

NOT something ENDSWITH '@2x.jpg' 
Cuestiones relacionadas