2012-07-30 49 views
6

有點難以解釋,但我試圖使用NSPredicate過濾由ID的自定義NSManagedObject的數組。我有一個可以發送更新,刪除或添加新對象的服務器,並且我需要控制JSON文件中的這些對象是否已經存在,如果存在,只需更新它們或者插入到核心數據中。NSPredicate檢查NSArray如果對象有幾個ID

我使用這個謂詞現在:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"storeId != %@", [jsonFile valueForKey:@"Id"]; 

凡jsonFile包含非解析庫對象。但是有了這個謂詞,它會給我一個巨大的數組,因爲一個id將不同於某個storeId,並且next id會匹配。

JSON文件是某種類型的:

 "Stores":[{ 
      "id":1, 
      "name":"Spar", 
      "city":"London" 
      } 
      { 
      "id":2, 
      "name":"WalMart", 
      "city":"Chicago" 
     }]; 

回答

11

我不知道如果我理解正確你想達到什麼目的,但也許你可以使用以下命令:

NSArray *jsonFile = /* your array of dictionaries */; 
NSArray *idList = [jsonFile valueForKey:@"id"]; // array of "id" numbers 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT(storeId IN %@)", idList]; 

這會得到有storeId不等於任何jsonFile數組中的ID的所有管理對象。

+0

這正是我所需要的!謝謝!如果我需要檢查另一種方式,我只是將其更改爲'NSPredicate * predicate = [NSPredicate predicateWithFormat:@「NOT(Id IN%@)」,fetchedArray];' – lagos 2012-07-31 08:47:45

+0

非常優雅的解決方案,謝謝! – Markus 2015-05-04 08:02:00

0

謂詞的語法可能關閉 - 別人可能會建議修復 - 但是如果你有一個數組,爲什麼不使用

- (NSUInteger)indexOfObjectPassingTest:(BOOL (^)(id obj, NSUInteger idx, BOOL *stop))predicate 

因爲它的要容易得多:

NSInteger textID = ... // you set this 
NSInteger idx = [myArray indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop)) 
{ 
NSInteger objIdx = [obj objectForKey:@"id"] integerValue]; // integerValue works for both NSNUmbers and NSStrings 
if(objIdx == testID) { 
    return YES; 
    *stop = YES; 
} 
}