1

RestKit と CoreData を使用している iOS アプリがあります。リクエストボディがNSDictionary. 私が抱えている問題は、リクエストの本文に重複したキーが必要なことです。 NSDictionary一意のキーが必要なので、これを機能させる方法がわかりません。

サーバーがリクエスト本文を期待する方法は次のとおりです。

<node>
    <personId>2</personId>
    <status>2</status>
    <title>Dinosaur unearthed somewhere out there. </title>

    <point>
        <city>Somewhere</city>
        <copy><![CDATA[An amazing discovery was unearthed as a local farmer was plowing his field]]></copy>
        <state>Outthere</state>
        <sequence>1</sequence>
    </point>

    <point>
        <city>Somwhere</city>
        <copy><![CDATA[Archeologists from around the world are amazed at the pristine condition of the remains. Also of note is that the farmer was only using a single blade plow on his John Deere tractor when it was unearthed. ]]></copy>
        <sequence>2</sequence>
        <state>Outthere</state>
    </point>

    <point>
        ......
    </point>
</node>

これは、私がそれを機能させようとした方法の簡略化されたバージョンです....

params = [[NSMutableDictionary alloc] init];
nodes = [[NSMutableDictionary alloc] init];
nodeParams = [[NSMutableDictionary alloc] init];

NSString *personId = @"2";
NSString *status = @"2";
NSString *title = @"Dinosaur unearthed somewhere out there.";
NSString *city = @"Somewhere";
NSString *state = @"OutThere";
NSString *copyField = @"Testing this out to see if it works";

//Here I set up the point layer of the request body
//In my code this three line section is in a loop. Obviously this does not work because it just overwrites the objectForKey each time through the loop.
[params setObject:copyField forKey:@"copy"];
[params setObject:city forKey:@"city"];
[params setObject:state forKey:@"state"];

//Here I Set up the Node Layer of the request body
[nodeParams setObject:params forKey:@"point"];
[nodeParams setObject:personId forKey:@"personId"];
[nodeParams setObject:status forKey:@"status"];
[nodeParams setObject:title forKey:@"title"];
[nodes setObject:nodeParams forKey:@"node"];

NSLog(@"The Dictionary is %@",nodes);

実行時に、ログはボディが適切にフォーマットされていることを示していますが、それらは 1 つのポイント レイヤーのみであり、ループ内の最終パスからのデータが取り込まれています。これを回避するためのトリックを知っている人はいますか?

注として、postObjectメソッドは辞書をJSONシリアル化ツールに渡すため、NSDictionaryが必要だと思います。シリアル化ツールは、辞書が渡されることを期待していると思われます。間違っている場合は、誰かが知っている場合は修正してください。

4

1 に答える 1

0

さて、私はついにこれを理解しました。上記の XML を JSON に変換するまで、その方法を理解することはできませんでした。重要なのは、「NSJSONSerialization」クラスで配列と NSDictionary がどのようにフォーマットされているかを認識することです。

以下は、サーバーがどのように JSON を予期していたかの例です。

{ "status":"2",
  "title":"test #5",
  "personId":"1",
  "point":[
           { "copy":"<p class=\"pt\" data-seq=\"1\">This is paragraph #1<\/p>",
             "state":"OutThere",
             "city":"Somewhere",
             "sequence":"1"
           },

           { "copy":"<p class=\"pt\" data-seq=\"2\">This is paragraph #2<\/p>",
             "state":"OutThere",
             "city":"Somewhere",
             "sequence":"2"
           }
      ]
}

ここで注意すべき重要なことは、"point"フィールドが Array of Dictionaries であることです。は[配列を表します。ループのたびに辞書を再初期化し、新しいオブジェクトを追加してから、以下に示すように現在の辞書を配列に追加できることをようやく理解できました。

while (![theScanner isAtEnd]) {
    count = count +1;

    //Initialize the dictionary
    points = [[NSMutableDictionary alloc] init];

    NSString *htmlTag = [NSString stringWithFormat:@"<p class=\"pt\" data-seq=\"%d\">",count];
    [theScanner scanUpToCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:&temp];

    NSString *preTagText = [htmlTag stringByAppendingString:temp];
    NSString *postTagText = [preTagText stringByAppendingString:@"</p>"];
    NSString *sequence = [NSString stringWithFormat:@"%d",count];
    [points setObject:postTagText forKey:@"copy"];
    [points setObject:sequence forKey:@"sequence"];
    [points setObject:city forKey:@"city"];
    [points setObject:state forKey:@"state"];
    [pointArray addObject:points];
     points = nil;

}
[params setObject:titleText forKey:@"title"];
[params setObject:personIdNumber forKey:@"personId"];
[params setObject:status forKey:@"status"];
[params setObject:pointArray forKey:@"point"];

ループが終了したらpointArray、キーを持つオブジェクトとして辞書に追加しますpoint(Wain に感謝します)。titlestatus、およびオブジェクトを同じディクショナリに追加し、personIdそれを Restkit POST リクエストに必要な NSDictionary として使用します。

于 2013-10-31T01:23:00.347 に答える