2012-07-30 11 views
6

Ít khó khăn để giải thích nhưng tôi đang cố gắng sử dụng NSPredicate để lọc một mảng với NSManagedObject tùy chỉnh theo id. Tôi có một máy chủ có thể gửi cập nhật, xóa hoặc thêm các đối tượng mới, và tôi cần phải kiểm soát nếu các đối tượng đó từ tệp JSON đã tồn tại, nếu tồn tại chỉ cần cập nhật chúng hoặc chèn vào dữ liệu cốt lõi nếu không.NSPredicate kiểm tra NSArray nếu đối tượng có một số ID

Tôi đang sử dụng vị này ngay bây giờ:

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

đâu jsonFile chứa các đối tượng cửa hàng chưa phân tích. Nhưng với vị từ này, nó sẽ cho tôi một mảng lớn, vì một id sẽ không giống như một số storeId, và id tiếp theo sẽ khớp.

tệp JSON là một số loại này:

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

Trả lời

11

tôi không chắc chắn nếu tôi hiểu đúng những gì bạn đang cố gắng để đạt được, nhưng có lẽ bạn có thể sử dụng như sau:

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

này sẽ cung cấp cho tất cả các đối tượng quản lý mà có một storeId đó không phải là tương đương với bất kỳ của các id trong mảng jsonFile.

+0

Đó chính xác là những gì tôi cần! Cảm ơn bạn! Và nếu tôi cần kiểm tra theo cách khác, tôi chỉ thay đổi nó thành 'NSPredicate * predicate = [NSPredicate predicateWithFormat: @" NOT (Id IN% @) ", fetchedArray];' – lagos

+0

Giải pháp thực sự thanh lịch, cảm ơn bạn! – Markus

0

Cú pháp của các vị có lẽ là tắt - một người nào khác có thể đề nghị một sửa chữa - nhưng nếu bạn có một mảng, tại sao không sử dụng

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

kể từ khi nó dễ dàng hơn nhiều:

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