1

私の JSON 応答は次のようになります。

{
  "enabled": false,
  "number_of_articles": 20,
  "new_users": [
    {
        "id": "5001",
        "name": "Jimmy Valner"
    },
  ],
  "articles" : [
  { 
    "id" : 33122,
    "title" : "Something",
    "authors": [
      {
          "id": "511",
          "name": "Somebody"
      },
      {
          "id": "51",
          "name": "Somebody else"
      }
  }]
}

私が知っている適切なRESTful応答ではありません。しかし、どうにかして 2 つの異なるエンティティ (ユーザーと記事) にマップする必要があります。記事部分の作業コードが既にあります。Article と Articles をリレーションとしてマップします。私はこのようにやっています:

RKMapping *mapping = [MappingProvider articlesMapping];
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor
                                            responseDescriptorWithMapping:mapping
                                            pathPattern:@"/articles/:userId/latest"
                                            keyPath:@"articles"
                                            statusCodes:statusCodeSet];
NSURLRequest *request = [[RKObjectManager sharedManager] requestWithObject:nil
                                                  method:RKRequestMethodGET
                                                    path:[NSString stringWithFormat:@"/articles/%@/latest", [[CredentialStore sharedInstance] userId]]
                                              parameters:nil];

RKManagedObjectStore *store = [[DataModel sharedDataModel] objectStore];

RKManagedObjectRequestOperation *operation = [[RKManagedObjectRequestOperation alloc] initWithRequest:request
                                                                    responseDescriptors:@[responseDescriptor]];
operation.managedObjectCache = store.managedObjectCache;
operation.managedObjectContext = store.mainQueueManagedObjectContext;

[operation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
    NSLog(@"%@", mappingResult.array);
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
    NSLog(@"ERROR: %@", error);
    NSLog(@"Response: %@", operation.HTTPRequestOperation.responseString);
}];
[operation start];

これは期待どおりに機能しています。メソッドでマッピング手順を提供し+ (RKMapping *)articlesMappingます。JSON 応答の作成者の部分も適切にマッピングされています。

new_usersここで、配列を別のエンティティにマップしたいと思います(明らかにユーザー)。サーバーへの別のリクエストを呼び出さないようにするにはどうすればよいですか? 別の作成に成功しましたRKManagedObjectRequestOperation *operationが、もちろん、回避したいサーバーへの別のネットワーク要求をトリガーします。ここで解決策を探す必要がありますか、RKObjectManagerまたは何らかの方法で keyPath を変更してルートレベルで開始し、+ (RKMapping *)メソッド内のさまざまなエンティティのマッピングを行う必要がありますか (おそらくそうではありません) ?

そして別の質問..このJSONからプロパティにアクセスするenabledにはどうすればよいですか? number_of_articles繰り返しますが、構造化された安らかな応答を扱っているわけではありませんが、何らかの方法で対処する必要があります。どうにかしてこのプロパティにアクセスしたいだけです...エンティティへのマッピングは必要ありません。

4

1 に答える 1

4

RKManagedObjectRequestOperationにはinitWithRequest:responseDescriptors:理由があります。特に「s」オンresponseDescriptorsと、配列を渡しているという事実に注意してください。これは、複数の応答記述子を構成できることを意味します。それぞれのパス パターンは同じですが、キー パスは異なります。RestKit は、サーバーから受信した応答でそれぞれを処理します。

これを行うと、おそらく変更したくなることに注意してください。これNSLog(@"%@", mappingResult.array);は、リストの最上位の項目がすべて含まれるためです。代わりに、おそらく使用する必要がありますNSLog(@"%@", mappingResult.dictionary);

于 2013-07-09T18:55:58.383 に答える