[iOS]NSRunLoopとwhileループは別物?

非同期処理をすると、処理が並行的に処理されるため、メインの処理終了後にデリゲートが通る場合が多い。

今回は

[[NSURLConnection alloc] initWithRequest:request delegate:self];



の後に記述する2つのループについての話題です。


このコードは、非同期で通信を行い、データが取得できると"connection:didReceiveData:"を呼び出します。
ただし、こいつがどのタイミングで呼び出されるのかは分からないのです。

そこで、その取得が終わるまでループで待機するということをするのですが。

前回その処理をあれこれしようと砕けてました。
([iOS]非同期通信で同期的な通信のタイムアウト(は無理でした)を参照)

あの後、結局NSThreadは使えないやつなんだとぽいっと捨てていたのです。
その時一緒に使っていたNSRunLoopもぽいっと頭の隅っこに捨てていたのですが・・・。

ふと、もう一回使ってみるかという思ったのが今回の出来事。

Ex)NSURLConnectionの後に記述したケース

whileループのケース:
whileループ内で以下のように処理をしています。

double count = 0.0;
while(!data){
count = count + 0.1;
}

このケースではいくら待機してもデリゲートには入らず、このループからフォーカスが外れないため、ピクリともしない。

NSRunLoopのケース:
以下の処理をしています。

[[NSRunLoop currentRunLoop] run];

このケースだと、なぜかいくらかループしたのちにデリゲートが作動しました。


結果的にただのループではないことが判明しました(あたりまえかもしれない)。

NSThreadと併用できないところをみると、こいつもNSThread同様の何かしらの処理をしてるのかという予測が立つ。

現在調査中です(2011/06/14)。

参考URL:
[Geekなぺーじ]
NSURLConnection (非同期) [1]
このエントリーをはてなブックマークに追加

コメントの投稿

非公開コメント

Translation


プロフィール

チーズくん

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

バロメーター
最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ