1

私の質問は

RestKit: 文字列の単純な JSON 配列を取得する方法は?

ただし、元の作成者は回答が役立つと感じましたが、私はまだ迷っています。KVCこの質問には 2 つの個別の参照が含まれていますが、どちらも私 (との完全な初心者) を助けるには十分ではありませんでしたRestKit

1 つのリファレンスがここにあり、このサンプル コードを示します

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 * である 1 つのプロパティを持つラッパー クラスを作成する必要があることを意味していますか?

@"someAttribute" とは何ですか? 繰り返しますが、これはラッパー クラスを暗示しているのでしょうか。その場合、someAttribute は NSArray * であるラッパー クラスのプロパティの名前になりますか?

もう 1 つの参照はhereであり、配列から「ラッパー クラス」へのフェッチを示していますが、ラッパー クラスには配列ではなく NSNumber が 1 つしかありません。そのため、その例を配列全体を取得するために機能するものに変える方法は明確ではありません。

参考までに、サーバーは元の質問と同じように文字列の配列を返しています: ["string1", "string2", "string3"].

アップデート

これが私が試みたコードです。ラッパークラスを作成しました。

@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さらに手がかりを収集できるかどうかを確認します。

更新#2

ここで blakewatters が述べたように、この例ではマッピングを行っておらず、 RestKit. 問題は、私が書いているすべてのコードがサービス層で使用されてRestKitおり、すべての呼び出しのパターンをやみくもに従っていたことです。この呼び出しの正しい答えは、AFNetworking直接アクセスする方法を理解することかもしれません。

4

2 に答える 2

6

ここで blakewatters からの別のコメントを使用したより良い答えがあります

このようなリクエストには 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);
        }];
于 2014-01-08T23:04:37.877 に答える
0

UPDATEセクションで行っている方法が機能することがわかりました。

RKMappingSourceObject は厄介者でした。NSProxy を実装しているため、期待していた NSString と同じように動作します。

舞台裏で何が起こっているかについての私の推測: RestKit は、デシリアライズ中に RKMappingSourceObject インスタンスを作成します。私が持っているこれらのオブジェクトがプリミティブであり、何にもマップされていないことがわかると、それらをマッピングオブジェクトに残すだけですが、NSProxy を実装しているため、基になる文字列に要求を転送できます。

于 2014-01-08T20:27:46.817 に答える