2014-01-08 3 views
1

Мой вопрос является дубликатомКак извлечь простой JSON массив строк с помощью restkit

RestKit: how to fetch a simple JSON array of strings?

Однако, в то время как оригинальный автор нашел ответы полезным, я все еще потеряно. Этот вопрос содержит две отдельные ссылки, ни одна из которых не прошла достаточно далеко, чтобы помочь мне (полный новичок в KVC и RestKit).

Одна ссылка here и дает этот пример кода

RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[Whatever class]]; 
[mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:nil toKeyPath:@"someAttribute"]]; 
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:mapping pathPattern:@"/whatever" keyPath:nil statusCodes:nil]; 

Что бы ни класс должен быть? Должно ли это быть NSString? Или это подразумевает, что я должен создать класс-оболочку с одним свойством NSArray *?

А что такое @ someAttribute? Опять же, это подразумевает класс-оболочку, в этом случае someAttribute будет именем свойства в моем классе-оболочке, который является NSArray *?

Другая ссылка - here, и пока она показывает выборку из массива в «класс-оболочку», класс-оболочка имеет только один NSNumber, а не массив. Поэтому неясно, как превратить этот пример в тот, который работает для получения всего массива.

Для справки сервер возвращает массив строк так же, как и исходный вопрос: ["string1", "string2", "string3"].

UPDATE

Вот код, который я пытался. Я создал класс-оболочку.

@interface CannedResponse : NSObject 

@property (strong, nonatomic) NSString * response; 

@end 

Вот отображение:

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; 

И я звоню getObjectsAtPathForRouteName

Что я получаю обратно массив CannedReponses, как ожидалось. Однако вместо того, чтобы помещать в свойство ответа NSString. Я получаю RKMappingSourceObject. Теперь RKMappingSourceObject действительно содержит правильную строку.

Я просмотрю регистрацию RestKit, чтобы узнать, могу ли я получить еще несколько подсказок.

UPDATE # 2

Как уже упоминалось here по blakewatters Я не делаю никакого отображения в этом примере и просто можно обойти использование RestKit. Проблема в том, что весь код, который я пишу на уровне службы, использует RestKit, и я слепо следил за шаблоном для всех вызовов. Для этого вызова правильным ответом может быть выяснить, как напрямую обращаться к AFNetworking.

ответ

6

Вот лучший ответ, используя другой комментарий от blakewatters here

Не используйте RestKit для запроса, как это. Используйте AFNetworking для этого. И вы можете получить доступ к AFHTTPClient как этот

[RKObjectManager sharedManager].HTTPClient 

Затем код выглядит примерно так

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); 
     }]; 
0

Оказалось, что способ, которым я занимаюсь этим в разделе UPDATE, действительно работает.

RKMappingSourceObject был красной селедкой. Он реализует NSProxy, и поэтому он действует так же, как и ожидаемый NSString.

Мое предположение о том, что происходит за кулисами: RestKit создает экземпляры RKMappingSourceObject, поскольку он десериализуется. Когда он понимает, что эти объекты, которые у меня есть, являются примитивами и не сопоставляются ни с чем, он просто оставляет их в объекте сопоставления, но так как он реализует NSProxy, он может перенаправлять любые запросы на базовую строку.