2013-10-09 3 views
1

Когда я выполняю POST объекта, ответ сопоставляется с неправильным объектом.RestKit POST-ответ с неправильным отображением

// Resquest for post new article 

RKObjectMapping* articleRequestMapping = [RKObjectMapping requestMapping]; 
[articleRequestMapping addAttributeMappingsFromDictionary:@{ 
                @"title" : @"title", 
                @"body" : @"body", 
                }]; 

RKRequestDescriptor *requestDescriptorArticle = [RKRequestDescriptor 
               requestDescriptorWithMapping:articleRequestMapping 
               objectClass:[Article class] 
               rootKeyPath:nil 
               method:RKRequestMethodPOST]; 

[objectManager addRequestDescriptor:requestDescriptorArticle]; 


// Response for post new article 
// response.body={ 
// "result": { 
//  "ok": 1 
// } 
// } 

RKObjectMapping *resultMapping = [RKObjectMapping mappingForClass:[Result class]]; 
[resultMapping addAttributeMappingsFromDictionary:@{ 
                @"ok" : @"ok" 
                }]; 

RKResponseDescriptor *resArticleCreate = [RKResponseDescriptor 
              responseDescriptorWithMapping:resultMapping 
              method:RKRequestMethodPOST 
              pathPattern:[NSString stringWithFormat:@"%@%@",apiVersion,@"/articles"] 
              keyPath:@"result" 
              statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; 
[objectManager addResponseDescriptor:resArticleCreate]; 

Журнал:

2013-10-09 07:05:43.335 TabbedDemo[35156:4703] D restkit.object_mapping:RKMapperOperation.m:378 Executing mapping operation for representation: { 
    result =  { 
     ok = 1; 
    }; 
} 
and targetObject: <Article: 0x7d88670> 

TargetObject является статья ..., но он должен быть результат ...

Я нашел старый подобный вопрос здесь: https://github.com/RestKit/RestKit/issues/1081 Я использую v0.21 (главная ветвь), теперь я решаю его, заставляя targetObject.

// normal one, but with wrong mapping object. 

// [[RKObjectManager sharedManager] postObject:article path:nil parameters:@{@"_csrf" : self._csrf} 
//          success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult){ 
//           NSLog(@"result:%@",[mappingResult firstObject]); 
//          } 
//          failure:^(RKObjectRequestOperation *operation, NSError *error) { 
//           NSLog(@"Hit error: %@", error); 
//          }]; 

RKObjectRequestOperation *operation = [[RKObjectManager sharedManager] appropriateObjectRequestOperationWithObject:article 
                     method:RKRequestMethodPOST 
                     path:nil 
                     parameters:@{@"_csrf" : self._csrf}]; 
Result *r1 = [Result new]; 
operation.targetObject = r1; 

[operation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { 
    NSLog(@"result:%@",[mappingResult firstObject]); 
} failure:^(RKObjectRequestOperation *operation, NSError *error) { 
    NSLog(@"Hit error: %@", error); 
}]; 

[operation start]; 

Это проблема с RestKit, или я делаю неправильно?

ответ

1

Это предположение конструкции RestKit. В некоторых случаях это вызывает проблемы. При публикации и объекте RestKit всегда будет пытаться отобразить ответ на тот же объект.

Ваше обходное решение - хорошая альтернатива.

Вы также можете опубликовать словарь и вернуть результат в этот словарь.

+0

Спасибо. Из-за чего меня смущает, почему мне нужен RestKit вместо того, чтобы делать эти вещи с AFNetworking и JSON самостоятельно. Я потратил слишком много времени, чтобы попытаться заставить его работать, например, сопоставление объектов, маршрутизацию запросов, сопоставление под-объектов, динамическое сопоставление, ... И, наконец, я должен что-то сделать по-старому и потерять гибкость при обработке произвольного протокола , – blackgun

+0

Вы можете использовать AFNetworking, и вы должны использовать его там, где RestKit не эффективен или переполнен. Вы всегда можете делать что-то гибридное, когда вы используете AFNetworking для получения ответа JSON, а затем используете операцию MapKet в RestKit ... Как вы решаете, что использовать и когда приходит, чтобы испытать. – Wain

Смежные вопросы