0

オブジェクトの JSON 連想配列を RestKit(iOS) にマップする必要があります。プロパティ 135,145,423 とその上のオブジェクトを持つオブジェクトのように見えます。

{
  "135": {
    "name" : "Object1",
    "property1" : "Value1",
    "anotherProperty1" : "Value2"
  },
  "145": {
    "name": "Object2",
    "property1" : "Value1",
    "anotherProperty1" : "Value2"
  },
  "423": {
    "name": "Object3",
    "property1" : "Value1",
    "anotherProperty1" : "Value2"
  }
}

機能する単一オブジェクトのマッピングがあります。マッピングは CoreData に対して実行されます。私が持っている唯一の解決策は、連想配列を通常の配列に変換し、数値を「id」フィールドに配置することですが、それはエレガントな解決策ではないと思います。

そのようなマッピングをRestKitで直接実行する正しい方法はありますか?

4

2 に答える 2

1

これが私の状況の解決策です。

NSIndexSet *statusCodes = RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful); // Anything in 2xx

// 1. Create dynamic mapping
RKDynamicMapping* dynamicMapping = [[RKDynamicMapping alloc] init];
// 2. Process every entry separately
dynamicMapping.forceCollectionMapping = YES;

// 3. Set mappings for every object
[dynamicMapping setObjectMappingForRepresentationBlock:^RKObjectMapping *(id representation) {
    // 4. Mapping to Core Data (Can be replaced with RKObjectMapping if there's no need of CodeData)
    RKEntityMapping *singleRouteMapping = [RKEntityMapping mappingForEntityForName:@"Object" inManagedObjectStore:managedObjectStore];
    // 5. Walking through all keys (but with dynamicMapping.forceCollectionMapping = YES) there'll be only one. It's better to refactor it.
    for (NSString *key in representation) {
        // 6. Set mappings for every property exect 'id'
        [singleRouteMapping addAttributeMappingsFromDictionary:@{
         [NSString stringWithFormat: @"%@.name", key]: @"name",
         [NSString stringWithFormat: @"%@.property1", key]: @"property1",
         [NSString stringWithFormat: @"%@.anotherProperty1", key]: @"anotherProperty1"
         }];
    }
    // 7. Map 'id' property at last
    [singleRouteMapping addAttributeMappingFromKeyOfRepresentationToAttribute: @"id"];

    return singleRouteMapping;
}];

RKResponseDescriptor *pluralDescriptor = [RKResponseDescriptor responseDescriptorWithMapping: dynamicMapping
    pathPattern: @"/api/objects"
    keyPath: nil
    statusCodes: statusCodes];

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.somesite.com/api/objects"]];
RKManagedObjectRequestOperation *operation = [[RKManagedObjectRequestOperation alloc] initWithRequest:request responseDescriptors:@[pluralDescriptor]];
于 2013-06-06T16:37:22.270 に答える
0

ディクショナリで受信したキーに対して特別にマッピングが作成される動的マッピングを使用する必要があります。宛先オブジェクトが何であるか、またはマッピングが何であるかを言わないので、これは一般的な例です (コア データの場合ですが、プレーン オブジェクトに変更できます)。

RKDynamicMapping* dynamicMapping = [[RKDynamicMapping alloc] init];

[dynamicMapping setObjectMappingForRepresentationBlock:^RKObjectMapping *(id representation) {

RKEntityMapping* typeMapping = [RKEntityMapping mappingForEntityForName:@"..." inManagedObjectStore:objectStore];

for (NSString *key in representation) {
    NSDictionary *type = [representation objectForKey:key];
    [typeMapping addAttributeMappingsFromDictionary:@{
            [NSString stringWithFormat:@"%@.name", key]: @"name"}];
}

return typeMapping;
}]; 

RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:dynamicMapping
                                                                               pathPattern:...
                                                                                   keyPath:nil
                                                                               statusCodes:[NSIndexSet indexSetWithIndex:200]];

これは基本的に数字を取り除き、それらを捨てます。動的マッピングを構成することにより、必要に応じてそれらを含めることができます。

于 2013-06-06T07:30:53.577 に答える