2012-08-02 10 views
6

Ho un elenco di immagini in bundle app e hanno bisogno di visualizzare quelle appropriate in app, l'immagine ha il formato:NSPredicate: come NON si conclude?

###_photo_#.jpg 

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

così per esempio

1000_photo_1.jpg 
1000_photo_2.jpg 

ho usato per ottenere la lista di file nel pacchetto ed usare un predicato per filtrare altri file:

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

ma vi sono immagini retina che terminano con @ 2x.jpg, quindi questo metodo bisogno t o essere risolto, sto pensando di aggiungere:

NOT ENDSWITH '@2x.jpg' 

ma è corretto? dovrei dire:

NOT (ENDSWITH '@2x.jpg') 

o:

(NOT ENDSWITH '@2x.jpg') 

invece?

+2

Qualsiasi motivo per cui non è possibile utilizzare predicateWithBlock? – Jessedc

risposta

1

Penso che un'opzione migliore in iOS 4.0+ sia quella di utilizzare NSPredicate predicateWithBlock: per definire le condizioni. In questo modo puoi utilizzare le funzioni standard di NSString come hasSuffix: per verificare le tue conclusioni con caso negativo.

Checkout un buon tutorial qui: http://www.wannabegeek.com/?p=149

Ecco un modo di base si potrebbe utilizzare.

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]]]; 
}]; 

È quindi possibile afferrare il vostro array di file

[arrayOfFiles filterArrayUsingPredicate:predicate]; 
+0

Ma 'predicateWithBlock' non funziona con l'archivio SQLite, giusto? Se si utilizza l'archivio SQLite, è necessario fornire una stringa di formato per il predicato. – BallpointBen

8

È possibile utilizzare una stringa predicato come questo:

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

Penso che questa risposta sia molto più semplice di un predicateWithBlock. Certo, se hai bisogno di fare altre cose, il predicatoWithBlock è la strada da percorrere, ma semplicemente per avere una condizione NOT, la stringa di predicato tra parentesi è la soluzione giusta! – ericWasTaken

+0

Ognuno presenta vantaggi e svantaggi. Il principale vantaggio della mia risposta, che non si applica alla situazione di hzxu, è che i dati di base possono trasformarlo nella clausola WHERE di una query di database (possibilmente utilizzando un indice). I dati principali non possono farlo con un predicato di blocco. –

5

È possibile incapsulare un predicato in un altro predicato:

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

T il suo consente di preservare la stringa di formato leggibile esistente. Si noti che con NSCompoundPredicate, è anche possibile creare predicati AND e OR. Da questi tre (AND, OR, NOT), si può anche ricavare le cose come XNOR e predicati NAND (anche se come farlo è un esercizio lasciato al lettore ...)

1

Prova questo:

NOT something ENDSWITH '@2x.jpg' 
Problemi correlati