Wie rufe ich mit Restkit ein einfaches JSON-Array von Zeichenfolgen ab?
-
20-12-2019 - |
Frage
Meine Frage ist ein Duplikat von
RestKit:Wie rufe ich ein einfaches JSON-Array von Zeichenfolgen ab?
Obwohl der ursprüngliche Autor die Antworten hilfreich fand, bin ich immer noch verwirrt.Diese Frage enthält zwei separate Referenzen, von denen keine weit genug ging, um mir (einem völligen Anfänger) zu helfen KVC
Und RestKit
).
Eine Referenz ist Hier und gibt diesen Beispielcode
RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[Whatever class]];
[mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:nil toKeyPath:@"someAttribute"]];
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:mapping pathPattern:@"/whatever" keyPath:nil statusCodes:nil];
Was soll eine Klasse sein?Sollte es NSString sein?Oder bedeutet das, dass ich eine Wrapper-Klasse erstellen sollte, die eine Eigenschaft hat, nämlich ein NSArray *?
Und was soll @"someAttribute" sein?Bedeutet dies wiederum eine Wrapper-Klasse? In diesem Fall wäre someAttribute der Name der Eigenschaft in meiner Wrapper-Klasse, bei der es sich um ein NSArray * handelt?
Der andere Hinweis bezieht sich auf Hier und während das Abrufen aus einem Array in eine „Wrapper-Klasse“ gezeigt wird, hat die Wrapper-Klasse nur eine NSNumber, kein Array.Es ist also nicht klar, wie man dieses Beispiel in ein Beispiel umwandeln kann, mit dem man das gesamte Array erhalten kann.
Als Referenz gibt der Server ein Array von Zeichenfolgen zurück, genau wie bei der ursprünglichen Frage:["string1", "string2", "string3"].
AKTUALISIEREN
Hier ist Code, den ich versucht habe.Ich habe eine Wrapper-Klasse erstellt.
@interface CannedResponse : NSObject
@property (strong, nonatomic) NSString * response;
@end
Hier ist die Zuordnung:
RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[CannedResponse class]];
[mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:nil toKeyPath:@"response"]];
[manager addResponseDescriptor:[RKResponseDescriptor responseDescriptorWithMapping:mapping method:RKRequestMethodGET pathPattern:RESPONSES_API_PATH keyPath:nil statusCodes:nil;
Und ich rufe an getObjectsAtPathForRouteName
Was ich zurückbekomme, ist eine Reihe von CannedReponses
wie erwartet.Allerdings eher als ein NSString
wird in die Antworteigenschaft eingefügt.Ich bekomme eine RKMappingSourceObject
.Jetzt die RKMappingSourceObject
enthält tatsächlich die richtige Zeichenfolge.
Ich werde das durchsehen RestKit
Ich melde mich in der Konsole an, um zu sehen, ob ich weitere Hinweise finden kann.
UPDATE#2
Wie erwähnt Hier von blakewatters Ich mache in diesem Beispiel kein Mapping und kann die Verwendung von einfach umgehen RestKit
.Das Problem ist, dass der gesamte Code, den ich in der Serviceschicht schreibe, verwendet wird RestKit
und ich folgte bei allen Anrufen blind dem Muster.Für diesen Anruf könnte die richtige Antwort darin bestehen, herauszufinden, wie man darauf zugreifen kann AFNetworking
direkt.
Lösung
Hier ist eine bessere Antwort mit einem anderen Kommentar von Blakewatters Hier
Verwenden Sie RestKit nicht für eine Anfrage wie diese.Verwenden Sie dazu AFNetworking.Und Sie können auf diese Weise auf den AFHTTPClient zugreifen
[RKObjectManager sharedManager].HTTPClient
Der Code sieht dann einfach so aus
AFHTTPClient * client = [RKObjectManager sharedManager].HTTPClient;
[client getPath:YOUR_PATH
parameters:nil
success:^(AFHTTPRequestOperation *operation, id responseObject) {
success([NSArray arrayWithArray:responseObject]);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
failure(operation.response.statusCode);
}];
Andere Tipps
Es stellt sich heraus, dass die Art und Weise, wie ich es im Abschnitt UPDATE mache, funktioniert.
Das RKMappingSourceObject war ein Ablenkungsmanöver.Es implementiert NSProxy und verhält sich daher genau wie der NSString, den ich erwartet hatte.
Meine Vermutung, was sich hinter den Kulissen abspielt:RestKit erstellt beim Deserialisieren RKMappingSourceObject-Instanzen.Wenn es erkennt, dass diese Objekte, die ich habe, Grundelemente sind und nichts zugeordnet werden können, belässt es sie einfach im Zuordnungsobjekt, aber da es NSProxy implementiert, kann es alle Anforderungen an die zugrunde liegende Zeichenfolge weiterleiten.