0

リクエストがレスポンスと同じに見えず、レストキットのドキュメントでこれを見つけるのに本当に苦労しています。

基本的に、関連する2つのクラスがあります。ClassA には ClassB のコレクションがあります。ClassB のインスタンスを Web サービスに送信すると、予想どおり、他のクラス (ClassA) の pk を識別する属性が「ClassA」と呼ばれます。

しかし、サーバーがオブジェクトを正常に追加すると、サーバーはそれを送り返し、同じ属性は "ClassB1" と呼ばれません (Microsoft の方法)。

「inverseMapping」を使用するだけでは実際にはうまくいかないため、2つの異なるマッピングを使用したいと考えています。誰にもアイデアはありますか?

4

3 に答える 3

3

2 つのマッピングが答えであると考えるのは正しいです。RestKit の最新バージョンを使用していると仮定すると、次のようなものが機能します。

また、RestKit が提供する機能を実際に活用するには、JSON が Key Value Coding に準拠している必要があることにも注意してください。たとえば、この例では、JSON は "Response" キーでラップされています。

私が取り組んでいるプロジェクトからこれを取り出し、すべての名前を変更しました。これにより、正しい道に進むことができます。

RKObjectMapping *postObjectMapping = [RKObjectMapping requestMapping];
[postObjectMapping addAttributeMappingsFromDictionary:@{
 @"param1" : @"param1",
 @"param2" : @"param2"}];

RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:postObjectMapping objectClass:[PostObjectModel class] rootKeyPath:nil];

RKObjectMapping *returnedObjectMapping = [RKObjectMapping mappingForClass:[ReturnedModel class]];
[returnedObjectMapping addAttributeMappingsFromDictionary:@{
 @"returnedParam1" : @"returnedParam1",
 @"returnedParam2": @"returnedParam2",
 @"returnedParam3": @"returnedParam3"}];

RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:returnedObjectMapping pathPattern:nil keyPath:@"Response" statusCodes:[NSIndexSet indexSetWithIndex:200]];

RKObjectMapping *errorMapping = [RKObjectMapping mappingForClass:[RKErrorMessage class]];
[errorMapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"error" toKeyPath:@"errorMessage"]];

NSIndexSet *statusCodes = RKStatusCodeIndexSetForClass(RKStatusCodeClassClientError);
RKResponseDescriptor *errorDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:errorMapping pathPattern:nil keyPath:@"errors" statusCodes:statusCodes];


PostModel *objectToBePosted = [PostModel new];
[login setParam1:something];
[login setParam2:something];

RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:@"http://BASEURLHERE"]];
[objectManager addRequestDescriptor:requestDescriptor];
[objectManager addResponseDescriptor:responseDescriptor];
[objectManager addResponseDescriptor:errorDescriptor];

NSMutableURLRequest *request = [objectManager requestWithObject:objectToBePosted method:RKRequestMethodPOST path:@"/REST/OF/PATH/GOES/HERE" parameters:nil];

RKObjectRequestOperation *operation = [objectManager objectRequestOperationWithRequest:request
    success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
        NSLog(@"Success block: %@", mappingResult);
    } failure: ^(RKObjectRequestOperation *operation, NSError *error) {
        NSLog(@"Failed with error: %@", [error localizedDescription]);
    }];

[objectManager enqueueObjectRequestOperation:operation];

}

于 2012-12-17T20:52:00.130 に答える
2

RKEntityMapping スティックを mElling の回答で使用するには、次のように置き換えます。

RKObjectMapping *returnedObjectMapping = [RKObjectMapping mappingForClass:[ReturnedModel class]];
[returnedObjectMapping addAttributeMappingsFromDictionary:@{
 @"returnedParam1" : @"returnedParam1",
 @"returnedParam2": @"returnedParam2",
 @"returnedParam3": @"returnedParam3"}];

と:

RKEntityMapping *returnedObjectMapping = [RKEntityMapping mappingForEntityForName:@"ReturnedModel" inManagedObjectStore:objectManager.managedObjectStore];
[returnedObjectMapping addAttributeMappingsFromArray:@[@"returnedParam1", @"returnedParam2", @"returnedParam3"]];

注:また、"objectManager" 変数を設定した行を、returnedObjectMapping の前のどこかに移動する必要があります。

于 2013-02-11T15:32:07.680 に答える
0

この問題は、docksteaderluke が提案したように、mElling の回答で RKObjectMapping を使用することで解決されましたが、RestKit をバージョン 0.20-pre6 に更新した後でのみ解決されました。

于 2013-02-12T09:33:37.567 に答える