2012-07-30 9 views
6

Poco difícil de explicar, pero estoy tratando de usar NSPredicate para filtrar una matriz con NSManagedObject personalizado por ids. Tengo un servidor que puede enviar actualizaciones, eliminar o agregar nuevos objetos, y necesito controlar si esos objetos del archivo JSON ya existen, si existen, simplemente actualícelos o insértalos a los datos centrales, de lo contrario.NSPredicar comprobar NSArray si el objeto tiene uno de varios ID

estoy usando este predicado ahora:

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

Dónde jsonFile contiene objetos de las tiendas no analizadas. Pero con este predicado, me dará una gran variedad, ya que una identificación será diferente a una storeId, y la próxima identificación coincidirá.

archivo JSON es una especie de esto:

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

Respuesta

11

no estoy seguro de si he entendido bien lo que está tratando de lograr, pero tal vez usted puede utilizar el siguiente:

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

Esto dará a todos los objetos administrados que tienen una storeId que no es igual a cualquiera de los identificadores de la matriz jsonFile.

+0

¡Eso era exactamente lo que necesitaba! ¡Gracias! Y si necesito verificarlo de otra manera, simplemente lo cambio a 'NSPredicate * predicate = [NSPredicate predicateWithFormat: @" NOT (Id IN% @) ", fetchedArray];' – lagos

+0

¡Solución realmente elegante, gracias! – Markus

0

La sintaxis del predicado es, probablemente, fuera - de otra persona puede sugerir una solución - pero si usted tiene una matriz, por qué no usar

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

ya que es mucho más fácil:

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; 
} 
} 
Cuestiones relacionadas