2012-08-02 16 views
6

Mam listę obrazów w aplikacji pakietu i muszą posiadać odpowiednie te w aplikacji, obraz ma format:NSPredicate: jak NIE ZAKOŃCZYĆ?

###_photo_#.jpg 

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

tak na przykład

1000_photo_1.jpg 
1000_photo_2.jpg 

użyłem, aby otrzymać listę plików w wiązki i użyć predykatu odfiltrować inne pliki:

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

ale teraz są obrazy, które koniec siatkówki @ 2x.jpg, więc ta metoda potrzebne t o być stałe, myślę o dodaniu:

NOT ENDSWITH '@2x.jpg' 

ale jest to prawidłowe? Powinienem powiedzieć:

NOT (ENDSWITH '@2x.jpg') 

czyli

(NOT ENDSWITH '@2x.jpg') 

zamiast?

+2

Każdy powód, dla którego nie można użyć predicateWithBlock? – Jessedc

Odpowiedz

1

Uważam, że lepszą opcją w iOS 4.0+ jest użycie NSPredicate predicateWithBlock: do zdefiniowania warunków. W ten sposób możesz użyć standardowych funkcji NSString, takich jak hasSuffix:, aby sprawdzić swoje końce z ujemnym przypadkiem.

Zamówienie dobry samouczek tutaj: http://www.wannabegeek.com/?p=149

Oto podstawowy sposób można go używać.

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

Następnie można chwycić swoją tablicę plików

[arrayOfFiles filterArrayUsingPredicate:predicate]; 
+0

Ale 'predicateWithBlock' nie działa ze sklepem SQLite, prawda? Jeśli korzystasz ze sklepu SQLite, musisz podać ciąg formatu predykatu. – BallpointBen

8

Można użyć ciągu źródłowe takiego:

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

Myślę, że ta odpowiedź jest znacznie prostsza niż predicateWithBlock. Oczywiście, jeśli chcesz robić inne rzeczy, predicateWithBlock jest drogą do zrobienia, ale po prostu, aby mieć warunek NOT, nawiasowany łańcuch predykatów jest właściwym rozwiązaniem! – ericWasTaken

+0

Każda ma zalety i wady. Główną zaletą mojej odpowiedzi, która nie dotyczy sytuacji hzxu, jest to, że Core Data może przekształcić ją w klauzulę WHERE kwerendy bazy danych (ewentualnie przy użyciu indeksu). Core Data nie może tego zrobić przy pomocy predykatu blokowego. –

5

można otoczyć predykat w innym orzecznika:

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

T jego pozwala zachować istniejący czytelny ciąg formatujący. Zauważ, że dzięki NSCompoundPredicate możesz także tworzyć predykaty ORAZ i OR. Z tych trzech (AND, OR, NOT), można nawet czerpać rzeczy jak XNOR i orzeczników NAND (chociaż, jak to zrobić to ćwiczenie pozostawiamy czytelnikowi ...)

1

Spróbuj tego:

NOT something ENDSWITH '@2x.jpg'