2012-08-02 67 views
6

我在應用程序捆綁圖像列表需要顯示在應用適當的,圖像的格式是:NSPredicate:如何做不結束?

###_photo_#.jpg 

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

因此,例如

1000_photo_1.jpg 
1000_photo_2.jpg 

我用來獲取列表束中的文件,並使用謂詞濾除其它文件:

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

但現在有視網膜圖像,其一端與@ 2x.jpg,因此這種方法需要噸o是固定的,我想加入:

NOT ENDSWITH '@2x.jpg' 

但這是正確的嗎?我應該說:

NOT (ENDSWITH '@2x.jpg') 

或:

(NOT ENDSWITH '@2x.jpg') 

呢?

+2

爲什麼你無法使用predicateWithBlock? – Jessedc 2012-08-02 02:04:19

回答

1

我認爲在iOS 4.0+中更好的選擇是使用NSPredicate predicateWithBlock:來定義您的條件。這樣,你可以使用標準的NSString函數,如hasSuffix:來檢查你的endsWith消極情況。

結帳這裏一個很好的教程:http://www.wannabegeek.com/?p=149

這裏你可以使用它的根本途徑。

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

然後,您可以抓住你的文件

[arrayOfFiles filterArrayUsingPredicate:predicate]; 
+0

但'predicateWithBlock'不適用於SQLite存儲,對吧?如果使用SQLite存儲,則必須爲謂詞提供一個格式字符串。 – BallpointBen 2017-07-21 21:24:23

8

的陣列可以使用謂詞字符串是這樣的:

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

我認爲這個答案比predicateWithBlock簡單得多。當然,如果你需要做其他事情,predicateWithBlock是要走的路,但只要有一個NOT條件,帶括號的謂詞字符串是正確的解決方案! – ericWasTaken 2015-10-11 17:52:35

+0

各有優點和缺點。我的答案的主要優點不適用於hzxu的情況,Core Data可以將它轉換爲數據庫查詢的WHERE子句(可能使用索引)。核心數據不能通過塊謂詞來完成。 – 2015-10-12 02:18:13

5

您可以在另一個謂語封裝謂詞:

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

T他允許您保留現有的可讀格式字符串。請注意,使用NSCompoundPredicate,您還可以構建AND和OR謂詞。從這三個(AND,OR,NOT),你甚至可以得到像XNOR和NAND謂詞(儘管如何這樣做是一個練習留給讀者......)

1

試試這件事情:

NOT something ENDSWITH '@2x.jpg'