Pregunta

Soy relativamente nuevo en Objective-C y estoy intentando usar Restkit para recibir una respuesta JSON de un servicio web. He recibido con éxito los datos a mi aplicación, que se ve así viendo la respuesta:

{id:"1","Translation":"Test"}

Me gustaría asignar esta traducción a mi objeto "Traducción" en mi aplicación, pero he intentado de varias maneras diferentes, pero no estoy seguro de cómo lograr esto.

Entonces mis preguntas son:

  1. ¿Cómo puedo mapear esta respuesta a mi objeto de traducción?
  2. ¿Estoy haciendo esto correctamente, creando un método para completar esta llamada al superar mi controlador de vista?

Mi objeto de traducción

@implementation Translation  

@synthesize identifier = _identifier;
@synthesize translation = _translation;

- (NSDictionary*)elementToPropertyMappings {  
return [NSDictionary dictionaryWithKeysAndObjects:  
        @"id", @"identifier",  
        @"translation", @"translation",
        nil];  
}  

@end

Mi método de traducción

- (NSString *)performTranslation:(NSString *)translation
{

NSString *data = [[NSString alloc] initWithFormat:@"{\"SourceId\": \"%@\",\"RegionTag\": \"%@\",\"InputString\": \"%@\"}", @"1", @"Glasgow", translation];
NSString *post = data;

RKRequest *MyRequest = [[RKRequest alloc] initWithURL:[[NSURL alloc] initWithString:@"http://my.url.com/Translation/Translate"]];
MyRequest.method = RKRequestMethodPOST;
MyRequest.HTTPBodyString = post;
MyRequest.additionalHTTPHeaders = [[NSDictionary alloc] initWithObjectsAndKeys:@"application/json", @"Content-Type", @"application/json", @"Accept", nil];
[MyRequest send];

RKResponse *Response = [MyRequest sendSynchronously];

return Response.bodyAsString; <--- looking to map this to translation object here

}
¿Fue útil?

Solución

El fragmento de su código parece un poco desactualizado. Recomiendo encarecidamente leer el más nuevo Guía de mapeo de objetos Para aprovechar el reestimiento en su máximo potencial, especialmente la parte Mapeo sin KVC.

Editar:

Para publicar un objeto con replante y recibir una respuesta, definimos un TranslationRequest clase que mantendrá nuestra solicitud y Translation para mantener nuestra respuesta.

En primer lugar, configuramos nuestro RKObjectManager y mapeos (generalmente hago esto en mi AppDelegate):

RKObjectManager *manager = [RKObjectManager objectManagerWithBaseURL:kOurBaseUrl];
[manager setSerializationMIMEType:RKMIMETypeJSON];
//this is a singleton, but we keep the manager variable to avoid using [RKObjectManager sharedManager] all the time

//Here we define a mapping for the request. Note: We define it as a mapping from JSON to entity and use inverseMapping selector later.
RKObjectMapping *translationRequestMapping = [RKObjectMapping mappingForClass:[TranslationRequest class]];
[translationRequestMapping mapKeyPath:@"RegionTag" toAttribute:@"regionTag"];
...
[[manager mappingProvider] setSerializationMapping:[translationRequestMapping inverseMapping] forClass:[TranslationRequest class]];

//now we define the mapping for our response object
RKObjectMapping *translationMapping = [RKObjectMapping mappingForClass:[Translation class]];
[translationMapping mapKeyPath:@"id" toAttribute:@"identifier"];
[translationMapping mapKeyPath:@"Translation" toAttribute:@"translation"];
[[manager mappingProvider] addObjectMapping:mapping];

//finally, we route our TranslationRequest class to a given endpoint
[[manager router] routeClass:[TranslationRequest class] toResourcePath:kMyPostEndpoint];

Esto debería ser suficiente de la configuración necesaria. Podemos llamar a nuestro backend a cualquier parte del código (por ejemplo, en cualquier controlador) como este:

//we create new TranslationRequest
TranslationRequest *request = [[TranslationRequest alloc] init];
[request setRegionTag:@"Hello"];
....
//then we fetch the desired mapping to map our response with
RKObjectMapping *responseMapping = [[RKObjectManager sharedManager].mappingProvider objectMappingForClass:class]
//and just call it. Be sure to let 'self' implement the required RKObjectManagerDelegate protocol
[[RKObjectManager sharedManager] postObject:request mapResponseWith:responseMapping delegate:self];]

Pruebe este enfoque y avíseme si necesita alguna ayuda. No pude probarlo por completo, ya que no tengo ningún backend adecuado que devuelva las respuestas, pero a juzgar por el registro de descanso esto debería funcionar.

Otros consejos

Debe pasar la cadena JSON devuelta a un analizador JSON. yo suelo Sbjson. Luego puede usar el diccionario resultante para completar las propiedades de su objeto.

Restkit parece tener objetos nativos que encapsulan cuatro analizadores JSON diferentes. Sin embargo, aconsejaría precaución porque parecen asumir que el objeto analizado de nivel superior siempre será un diccionario.

Como otro aparte, el ejemplo en su pregunta no es JSON válido. Debe tener un aspecto como este:

{"id":"1","Translation":"Test"}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top