7

説明するのは少し難しいですが、カスタム NSManagedObject で配列を ID でフィルタリングするために NSPredicate を使用しようとしています。新しいオブジェクトの更新、削除、または追加を送信できるサーバーがあり、JSON ファイルからのそれらのオブジェクトが既に存在するかどうかを制御する必要があります。存在する場合は、それらを更新するか、そうでない場合はコア データに挿入します。

私は今この述語を使用しています:

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

jsonFile には、解析されていない Store オブジェクトが含まれています。しかし、この述語を使用すると、1 つの ID が一部の storeId と異なり、次の ID が一致するため、巨大な配列が得られます。

Jsonファイルは次のようなものです:

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

2 に答える 2

12

あなたが達成しようとしていることを正しく理解しているかどうかはわかりませんが、おそらく次を使用できます。

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

これにより、配列storeId内のどの ID とも等しくない を持つすべての管理対象オブジェクトが得られます。jsonFile

于 2012-07-30T13:41:33.537 に答える
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;
}
}
于 2012-07-30T13:08:32.747 に答える