Frage

Ich bin relativ neu in Objective-C und versuche, Restkit zu verwenden, um eine JSON-Antwort von einem Webdienst zu erhalten. Ich habe die Daten erfolgreich auf meine Anwendung zurückgelegt, was so aussieht, als würde ich die Antwort anzeigen:

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

Ich möchte diese Übersetzung in meine "Übersetzung" -Objekt in meiner Anwendung abbilden, habe aber ein paar verschiedene Arten ausprobiert, bin mir aber nicht sicher, wie ich dies erreichen soll.

Also meine Fragen sind:

  1. Wie kann ich diese Antwort auf mein Übersetzungsobjekt zuordnen?
  2. Mache ich das richtig und erstelle eine Methode, um diesen Anruf abzuschließen, meinen Ansichtsregler?

Mein Übersetzungsobjekt

@implementation Translation  

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

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

@end

Meine Übersetzungsmethode

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

}
War es hilfreich?

Lösung

Der Ausschnitt Ihres Codes scheint etwas veraltet zu sein. Ich empfehle dringend, das neueste zu lesen Objektzuordnungsanleitung Um Restkit in sein volles Potenzial zu nutzen - insbesondere in den Teil Mapping ohne KVC.

Bearbeiten:

Um ein Objekt mit Restkit zu veröffentlichen und eine Antwort zurück zu erhalten, definieren wir a TranslationRequest Klasse, der unsere Anfrage hält & Translation unsere Antwort halten.

Erstens haben wir unsere eingerichtet RKObjectManager und Zuordnungen (ich mache das normalerweise in meinem 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];

Dies sollte von dem erforderlichen Setup ausreichen. Wir können unser Backend überall im Code (z. B. in jedem Controller) wie folgt anrufen:

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

Probieren Sie diesen Ansatz aus und lassen Sie mich wissen, ob Sie Hilfe benötigen. Ich konnte ihn nicht vollständig testen, da ich kein geeignetes Backend habe, das die Antworten zurückgibt, aber nach dem RESTKIT -Protokoll dies zu beurteilen, sollte dies funktionieren.

Andere Tipps

Sie müssen die zurückgegebene JSON -String in einen JSON -Parser übergeben. ich benutze Sbjson. Sie können dann das resultierende Wörterbuch verwenden, um die Eigenschaften Ihres Objekts zu füllen.

Restkit scheint native Objekte zu haben, die vier verschiedene JSON -Parsers zusammenfassen. Ich würde jedoch Vorsicht raten, weil sie annehmen, dass das Parsen -Objekt auf höchster Ebene immer ein Wörterbuch sein wird.

Abgesehen davon ist das Beispiel in Ihrer Frage kein gültiges JSON. Es sollte so aussehen:

{"id":"1","Translation":"Test"}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top