2012-07-30 16 views
6

kimliğine sahip olduğunu kontrol edin Açıklamak biraz zor ama NSDS için özel bir NSManagedObject ile bir diziyi filtrelemek için NSPredicate kullanmaya çalışıyorum. Güncelleme, silme veya yeni nesneler ekleyebilen bir sunucum var. JSON dosyasındaki bu nesnelerin zaten var olup olmadığını kontrol etmem gerekiyor, eğer varsa sadece güncelleyin veya çekirdek verilere eklemeyin.NSPray nesnesinin birden çok ID

Şimdi bu yüklemi kullanıyorum: jsonFile çözümlenmemiş Mağaza nesneleri içeren

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

. Ancak, bu iddiayla, bir id, bazı storeId öğelerinden farklı olacağından ve bir sonraki kimlik eşleşeceğinden, bana büyük bir dizi verecek.

Json dosyası bu çeşit: - başkası bir düzeltme önerebilir - muhtemelen kapalı

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

cevap

11

Ben size ulaşmak için ne çalışıyorsunuz doğru anlamak emin değilim ama belki de şu kullanabilirsiniz:

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

Bu jsonFile dizide kimlikleri herhangi birine eşit olmayan bir storeId tüm yönetilen nesneleri verecektir.

+0

Tam olarak ihtiyacım olan buydu! Teşekkür ederim! Ve eğer başka bir şekilde kontrol etmem gerekiyorsa, bunu sadece NSPredicate * predicate = [NSPredicate predicateWithFormat: @ "NOT (Id IN% @)", fetchedArray]; ' – lagos

+0

Gerçekten şık bir çözüm olarak değiştirin, teşekkür ederim! – Markus

0

yüklem sözdizimi ancak bir dizi varsa, neden olmasın kullanmak

- (NSUInteger)indexOfObjectPassingTest:(BOOL (^)(id obj, NSUInteger idx, BOOL *stop))predicate 
onun çok daha kolay beri

:

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