Como faço para buscar um json simples matriz de seqüências de caracteres usando restkit
-
20-12-2019 - |
Pergunta
A minha pergunta é uma duplicata de
RestKit:como buscar um JSON simples matriz de seqüências de caracteres?
No entanto, enquanto o autor original encontrado as respostas útil, eu ainda estou perdida.Esta questão possui duas referências separadas, nem de que foi longe o suficiente para me ajudar (um completo novato no KVC
e RestKit
).
Uma referência é aqui e dá este exemplo de código
RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[Whatever class]];
[mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:nil toKeyPath:@"someAttribute"]];
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:mapping pathPattern:@"/whatever" keyPath:nil statusCodes:nil];
O que é o que a classe deve ser?Deve ser NSString?Ou é esta insinuando que eu deveria criar uma classe de wrapper que tem uma propriedade que é um NSArray *?
E o que é @"someAttribute" deveria ser?Novamente, é que isto implique uma classe de wrapper caso em que someAttribute seria o nome da propriedade na minha classe de wrapper que é um NSArray *?
A outra referência é a aqui e enquanto ele mostra a obtenção de uma matriz em uma "classe de wrapper", a classe de wrapper tem apenas um NSNumber, não é uma matriz.Por isso não está claro como transformar esse exemplo para o que funciona para obter a matriz inteira.
Para referência, o servidor está retornando uma matriz de seqüências de caracteres exatamente como o original da pergunta:["string1", "string2", "string3"].
ATUALIZAÇÃO
Aqui está o código que eu tenha tentado.Eu criei uma classe de wrapper.
@interface CannedResponse : NSObject
@property (strong, nonatomic) NSString * response;
@end
Aqui é o mapeamento:
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;
E eu estou chamando getObjectsAtPathForRouteName
O que eu estou ficando para trás é uma matriz de CannedReponses
como esperado.No entanto, em vez de um NSString
sendo colocado em resposta propriedade.Eu estou ficando um RKMappingSourceObject
.Agora o RKMappingSourceObject
de fato, contém a seqüência correta.
Eu vou estar olhando através de RestKit
o log no console para ver se consigo colher mais algumas pistas.
ATUALIZAÇÃO#2
Como mencionado aqui por blakewatters eu não estou fazendo qualquer mapeamento neste exemplo, posso simplesmente ignorar o uso de RestKit
.O problema é que todo o código que eu estou escrevendo na camada de serviço é usando RestKit
e eu estava cegamente seguindo o padrão para todas as chamadas.Para esta chamada, o direito de resposta pode ser para descobrir como acessar AFNetworking
diretamente.
Solução
Aqui está uma resposta melhor usar outro comentário de blakewatters aqui
Não use RestKit para um pedido como este.Use AFNetworking para fazê-lo.E você pode acessar o AFHTTPClient como este
[RKObjectManager sharedManager].HTTPClient
O código, em seguida, apenas parece algo como isto
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);
}];
Outras dicas
Acontece que a maneira que eu estou fazendo isso na secção UPDATE não funciona.
O RKMappingSourceObject foi um arenque vermelho.Ele implementa NSProxy e, portanto, atua apenas como o NSString eu estava esperando.
Meu palpite para o que está acontecendo por trás das cenas:RestKit criar RKMappingSourceObject instâncias, como é anular a serialização.Quando ele percebe que esses objetos que eu tenho são primitivos e não mapeiam para qualquer coisa é só deixa-los no mapeamento objeto, mas desde que ele implementa NSProxy pode encaminhar todas as solicitações para o subjacente de seqüência de caracteres.