スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
このエントリーをはてなブックマークに追加

[iOS]非同期通信で同期的な通信のタイムアウト(は無理でした)

無理だったので別記事にて、再度書き直します。
(2011/06/14)



[BPS Programmer's BLOG]
NSURLConnectionの同期通信でタイムアウトを設定したい(2)


上記URLで紹介されてました。

ソースが若干間違っているのでエラーを修正しながら利用しましたので、修正部を記しておきます。

05行目: NSURLRequest *request = [NSURLRequest requestWithURL:url];


requestWithURLはNSURLが引数です。
なので、sendRequestの引数名を_urlに変更したうえで上記の行の上に以下を追加します。

追加: NSURL *url = [NSURL URLReqquest requestWithURL:url];

これでOK


06行目: [request setTimeoutInterval:3.0]; //3秒で反応長ければエラーにする


実はこれ、定義ファイルみてみると
@interface NSMutableURLRequest : NSURLRequest
で定義されているもので、
NSURLRequestのメソッドを引っ張ってきているNSMutableURLRequestで定義されているために
NSURLRequestでは使えない。
なので

05行目: NSMutableURLRequest*request = [NSURLRequest requestWithURL:url];


と変更してやろう。

09行目: _response = nil; //_responseはvolatile指定したインスタンス変数


volatileについては
[C言語入門]
修飾子-volatile

を参照してください。
スレッドで変数を操作した時に、変数の値がコンパイラーのいたずらによって「この変数にこの値ははいらないだろう」と勘違いし、if文の条件をすっとばしてしまう場合がある。
これを避けるための同期処理だそうです。

ということでヘッダファイルにでも

追加: volatile NSString *_response;



とでも書いておけばいい。
(ちなみにこの変数には読み込み終了時に「おわったよ」という文字列が入る)


33行目: [connection release]; //実際には↑が無限ループなので呼ばれないはず


このreleaseはおそらく、30行目のリターンをキャッチしたものだと思われる。
なので、

30行目: NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];


とすればいい。

22行目: return _response;


ここでは警告がでます。
warning : Return discards qualifiers from pointer target type
返り値は対象の型ポインターから資格を破棄した。(多分こういう役)
対象は_response
型はvolatile NSString

じゃあもっかいNSStringでキャストすりゃいいんじゃ?と思って実行。

22行目: return (NSString *)_response;


warningは消え去りました。
ただこの方法正しいのかわかりません。
volatileについてもいまいち中の動作がはっきりしてませんが、
volatileで型を宣言するとNSStringとは別のオブジェクトとしてNSStringへの参照を持つのかな?とアバウトな考えをしてます。


ところでこのプログラム致命的な弱点が発見されました。
1、NSThreadにNSRunLoopは使用できないこと。(アップルのiOS Developer Libraryを参照)
2、NSThreadでNSURLConnectionを呼び出すとデリゲートが呼び出されない(下記参照)

[一昨日の杞憂]
NSURLConnectionによる非同期通信での注意


1も2も実践済みで、「なんでかなー」とずっと疑問でした。
1は納得しましたが、2がいまいち納得できない。
スレッドでデリゲートは呼ばれないと言いましたが、デリゲートどころか通信自体もしなかったりします。

ひたすらwhileループでNSURLConnectionを飛ばしまくる荒業も使いましたがピクリとも反応せず。
メインスレッドで使え、というのがアップル様の答えなのか・・・?


-結論-



ひとまずこの記事のソースは利用するのをやめました。使えませんので。

参考URL

[混沌のiPhoneアプリケーション工房]
NSStringについて

NSURLとNSStringの相互変換に利用

[C言語入門]
修飾子-volatile

volatileについての説明
このエントリーをはてなブックマークに追加
Translation


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。
プロフィール

チーズくん

Author:チーズくん
個人的メモをただ羅列しています。
twitter:@cheese1038

バロメーター
最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。