2012-07-30 12 views
6

Poco difficile da spiegare ma sto cercando di utilizzare NSPredicate per filtrare un array con NSManagedObject personalizzato per ID. Ho un server in grado di inviare aggiornamenti, eliminare o aggiungere nuovi oggetti, e ho bisogno di controllare se quegli oggetti dal file JSON esistono già, se esistono basta aggiornarli o inserirli nei dati di base se non lo sono.NSPredicate controlla NSArray se l'oggetto ha uno dei vari ID

Sto usando questo predicato ora:

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

Dove jsonFile contiene oggetti Negozio non analizzate. Ma con questo predicato, mi fornirà un array enorme, dal momento che un ID sarà diverso da qualche ID Store, e il prossimo ID corrisponderà.

di file JSON è una sorta di questo:

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

risposta

11

io non sono sicuro se ho capito bene quello che si sta cercando di ottenere, ma forse è possibile utilizzare il seguente:

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

Questo vi darà tutti gli oggetti gestiti che hanno una storeId che non è uguale a qualsiasi degli ID nella matrice jsonFile.

+0

Questo era esattamente ciò di cui avevo bisogno! Grazie! E se devo controllare l'altro modo, lo cambio in 'NSPredicate * predicate = [NSPredicate predicateWithFormat: @" NOT (Id IN% @) ", fetchedArray];' – lagos

+0

Soluzione davvero elegante, grazie! – Markus

0

La sintassi del predicato è probabilmente fuori - qualcun altro può suggerire una correzione - ma se avete un array, perché non utilizzare

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

fin dalla sua molto più facile:

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; 
} 
} 
Problemi correlati