Domanda

Sono relativamente nuovo per Objective-C e sto cercando di utilizzare RestKit di ricevere una risposta JSON da un servizio Web. Ho ricevuto con successo la parte posteriore dei dati a mia domanda, che si presenta come questo la visione della risposta:

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

vorrei mappare questa traduzione al mio oggetto "Traduzione" nella mia richiesta, ma hanno provato un paio di modi diversi, ma non sono sicuro di come raggiungere questo obiettivo.

Quindi le mie domande sono le seguenti:

  1. Come posso mappare questa risposta al mio oggetto di traduzione
  2. sto facendo questo in modo corretto, la creazione di un metodo per completare questa chiamata superare in astuzia il mio controller di vista?

Oggetto mia traduzione

@implementation Translation  

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

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

@end

Il mio Tradurre Metodo

- (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

}
È stato utile?

Soluzione

Il frammento del codice sembra un po 'obsolete. Consiglio vivamente la lettura del più recente guida Mapping oggetto al fine alla leva RestKit in esso del massimo potenziale - soprattutto la parte Mapping senza KVC .

Modifica:

Per poter pubblicare un oggetto con RestKit e ricevere indietro una risposta, si definisce una classe TranslationRequest che conterrà la nostra richiesta e Translation di tenere la nostra risposta.

In primo luogo, abbiamo fondato la nostra RKObjectManager e mappature (di solito faccio questo nel mio 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];

Questo dovrebbe essere sufficiente la configurazione necessaria. Siamo in grado di chiamare il nostro ovunque backend nel codice (ad esempio, in qualsiasi controller) in questo modo:

//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];]

Prova questo approccio e fatemi sapere se avete bisogno di assistenza .. Non ero in grado di testare pienamente come io non ho alcun backend adatto che restituirà le risposte, ma a giudicare dal RestKit registrare questo dovrebbe funzionare.

Altri suggerimenti

È necessario passare la stringa JSON restituita in un parser JSON. Io uso SBJSON . È quindi possibile utilizzare il dizionario risultante per popolare le proprietà dell'oggetto.

RestKit sembra avere oggetti nativi che incapsulano quattro diversi parser JSON. Tuttavia, vorrei consigliare cautela perché sembrano supporre che il livello superiore analizzato oggetto sarà sempre un dizionario.

Come un altro a parte, l'esempio nella sua domanda non è valida JSON. Esso dovrebbe essere simile a questo:

{"id":"1","Translation":"Test"}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top