がっ・たい。

 前回の機能をその(199)のkonohana_test23プロジェクトに組み込むざます。
 で、その(183)同様に単体テストもできるようhtmlParser06をkonohana_test24(konohana_test23から1個カウントあげます)の中にいれちゃうわけですな。
 ただーし、この中の
konohanaParser.h/m
POSTRequest.h/m

 は、今後konohana_test.xcodeprojからも使うことになるのでhtmlParser06から取り出して、新しく作った
konohanaDBNetwork

 ってフォルダに移動させます。

$テン*シー*シー-1

 でもって、このkonohanaDBNetworkフォルダをkonohana_test.xcodeprojに登録ときたもんだ。

$テン*シー*シー-2

 登録できたら、今度は新規にファイルを作ります。
konohanaDBNet.m

 こいつは何かというと、もともとあるKonohanaDB.mのネットワーク版です。
 今まではKonohanaDB.mでシミュレートしてGUIを作り込んでいたわけだけど、今回ちゃんとネットワークサーバーとデータをやり取りするわけですな。
 ファイルの作り方は画面へのタッチを検出する(1)あたりを参考(ただし継承元はUIViewじゃなくNSObject指定)にしてもらえればいんだけど、気をつけるのは今回ヘッダーファイルは作らないという事。というのも
konohanaDB.h

 をそのまま使うつもりだから。
 もともと、そのために用意したクラスなわけですよ。
 ヘッダーファイルを変更しないということは、GUI側はkonohanaDBを今までどおり使えるわけで、何も変更しないで勝手にネットワークサーバ対応になるってのが理想なわけです。

 はたして、もくろみどおりいきますかどうか、さてさて。

$テン*シー*シー-3

 で、まあ追加はいいんだけど、そのままkonohanaDB.hで定義したメソッドを実装しちゃうと衝突するわけですな。
 konohanaDB.hの実装がkonohanaDB.mにもkonohanaDBNet.mにも存在することになるから、Xcodeからすると、どっち使えばいいんだよって話になる。

 konohanaDB.mをプロジェクトから外しゃ終いなんですが、シミュレーション版も、あとあと使いたいわけですよ。
 というわけでターゲットを新しく作る事にします。
 ターゲットてのは、プロジェクト内のどのファイルを組み合わせてどんなアプリケーションを作るかを指定する指示書みたいなもんです。

$テン*シー*シー-4
↑こいつね

 で、今は
konohana_test

 ってのだけがあるわけですな。
 このターゲットを複製して、元々のターゲットではkonohanaDB.mを使い、新しいターゲットではkonohanaDBNet.mを使うようにするわけですよ。

 というわけで、まずはkonohana_testターゲットを右クリックだ!

$テン*シー*シー-5

 そうすっとコンテキストメニューが出てきて、この中から複製ってメニューを選ぶ事でターゲットを複製できるんですな。複製ができたら名前はkonohana_test_netあたりにします。konohana_test コピーのままでも支障はないけどね。

$テン*シー*シー-6

 で、名前をつけたらツールバーの左上にあるポップアップメニューから、このkonohana_test_netを選ぶ。これでターゲットの切り替えが完了。

$テン*シー*シー-7

 あとは、このターゲット用のファイルの組み合わせを指定するわけです。konohanaDB.mを使わないようにし、konohanaDBNet.mを使うようにするわけですな。

 手っ取り早く指定するには「グループとファイル」バーを右クリックで出てくるコンテキストメニューでターゲットのメンバーを選択っす。

$テン*シー*シー-8

 で、これでずらずらと各ファイルの左にチェックボックスが並ぶわけでして、以下のようにターゲットごとに使うファイル、使わないファイルを指定してやればいいわけです。

$テン*シー*シー-9

 これで、いつでもシミュレータ版に戻せる状態になったんで、心置きなくkonohanaDBNet.mの実装に入れるぞっと。

 まずはkonohanaDB.mで使ってたPrivateIDObject、VotePrivate、SuggestionPrivate、ContributionPrivateがいらなくなるわけですわ。
 こいつらはシミュレート用のクラスなんですが未公開なんで消したところでKonohanaDB.hにはなんの影響もしない。さくさくっと消しちゃいます。

 で、htmlParser.xcodeprojのhtmlParserViewController.mでやってる処理とkonohanaDB.mを照らし合わせると、結構なレベルで対応してるんですな。
 例えば、konohanaDBの
-(void)connect:(int)inID forword:(BOOL)forword;

 なんかはhtmlParser.xcodeprojのhtmlParserViewControllerの
-(int)getContributeID;

 でやってるkonohanaParserでの解析後にkonohanaParserのインスタンス変数listからNSDictionaryを順に取り出し、NSDictionaryに設定されたデータをdbDelegateのarrivedContribution: photo: name: comment: own:メソッドに渡してやればいいとか
-(void)addContribution:(UIImage*)inImage comment:(NSString*)comment;
はhtmlParserViewControllerの「投稿をおこなう」処理をそのまま使えたり(しまったkonohanaParserで提案のコメント取り出すの忘れてるわ…、まあいい)するわけです。

 前にも書いたように、本来ネットワーク経由のデータのやり取りはユーザーの使い勝手を考えて非同期でやるべきなんだけど、今回もそのまま同期版で動かしてみます。
 いきなり非同期とかハードル上げて組み込むと不具合出た時、対応が大変なのよ。
 段階的にレベルアップせんとね。

 なので、指定されたURLから画像をダウンロードしてUIImageを作るのは 
[[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:url]]

 ってやるだけにします。鬼簡単。
 ただしkonohanaParserが取り出したURLは、http://localhost/konohana/mainlist.phpからの相対パスなんで、これを絶対パスに直す必要がある。こいつはNSURLのクラスメソッドが便利。
NSURL* url = [NSURL URLWithString:[dic valueForKey:@"url"]
relativeToURL:[NSURL URLWithString:@"http://localhost/konohana/mainlist.php"]];


 準備が整ったのでいってみようかー。
 うりゃ!

$テン*シー*シー-10

 でたざます~。

$テン*シー*シー-11

 おお、ちゃんと提案リストも見れる。
 んじゃ、投稿は?
 シミュレータだからアルバムからしか指定できないけどな。

$テン*シー*シー-12

 おりゃあああ

$テン*シー*シー-13

 入ったざます~。
 んじゃ、編集は?
 よしよし自分の投稿だけ削除可能になってる。

$テン*シー*シー-14

 投稿削除したらSafari側もリロードしたら消えたし~、いいねいいねえ、いいよいいよ~。
 あらら、フィルタかける機能実装してないから、自分の投稿タブが機能してないや。というかサーバーにフィルタ機能つけたっけ?
 ぎゃああ、スクロールしたら下から同じページが~

$テン*シー*シー-15

 次ページ、前ページ要求部分、適当に書いたからね~、ま、ぼちぼちデバッグしていきましょう。
 支持コメントのリストもでないな、ふっ、いろいろ不具合あるけど、まあ、動いたちゅーことで…
 まずはめでたい。

 以下次回!

------------
サンプルプロジェクト:konohana_test24.zip