ASIFormDataRequestのPOSTデータを書き換える方法

ASIHTTPRequestという有名なObjective-C用のライブラリがあります。これのPOST, Multipart対応したものがASIFormDataRequestなのですが、1度実行したリクエストのPOSTデータの書き換えに少々苦戦しました。メモしておきます。

まず、POSTデータを読みだすには以下のようにします。

NSArray *array = [request postData];
for (NSDictionary *dict in array) {
     NSString *key = [dict objectForKey:@"key"];
     NSString *value = [dict objectForKey:@"value"];
}

このようにkeyとvalueを取得することができます。
一つ注意点があります。このpostDataは無名カテゴリ内でプロパティとして宣言されていますので、通常ユーザが操作することは想定していないと考えられます。
読み出しのみにするのが安全でしょう。
また、Xcodeがwarningを表示するかと思いますが、実装は存在しますので問題なく実行できます。

変更する際は通常通りsetPostValue:forKey:またはaddPostValue:forKey:で。

ここまででPOSTデータの変更ができましたが、このまま再度実行しても前のPOSTデータのままです。
実は実際に送信されるデータはpostDataではなくpostBodyです。postDataからpostBodyに変換する必要があります。

request.postBody = [NSMutableData data];
request.haveBuiltPostBody = NO;
[request buildPostBody];

この3行で完了です。
buildPostBodyはpostBodyに追記するため、まず空のMutableDataを用意します。
haveBuiltPostBodyがYESだと、buildPostBodyは動かない(returnされてしまう)ので、手動でNOに設定します。
その後、buildPostBodyでPOSTデータの生成を行います。

ASIHTTPRequestはドキュメントに載っていない情報があります。
(私が見落としているだけ??)
読みやすいコードなので、何か困ったらコードを覗いてみるのが良さそうです。