2012-02-02 19 views
1

私は、Webサービスとのインターフェイスを持つクラスのセットを作成しています。このコアでは、データは非同期NSUrlConnectionを使用してサービスから取得されます。私の考えでは、非同期であることが重要です。これらのWebサービスインターフェイスのクライアントは、進行中の要求を取り消す(つまりNSUrlConnectionを取り消す)必要があります。メインrunloopに非同期NSUrlConnectionがありません

WebサービスコールはJSONデータを返す可能性がありますが、これは多くの場合JSONデータが解析され、作成するクラスによって適切なデータ構造が作成されます。どのWebサービスメソッドが呼び出されたかによって、リクエストは高価になる可能性があります。メインスレッドで実行するには高価すぎるため、サービスリクエストを非同期に実行するオプションを追加するか、オプションを与えないか、非同期呼び出し。

非同期呼び出しはすべて正常に実行されていますが、NSUrlConnectionを非同期的に開始するのは、主なものではないrunloopで問題が発生しています。私が記述している問題はかなりよく書かれているようです:接続を開始するrunloopが終了したため、NSUrlConnectionの代理人が呼び出されていないと考えられ、その代理人への呼び出しをrunloop 。

この問題を解決する最善の方法は何ですか。

私が使用して試してみました:

while (!self.isRequestComplete && !self.isRequestCancelled) 
     [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; 
    } 

これが上で実行されている実行ループは、実際に私が持っていたため、メイン実行ループ、ある場合を除いて、私が行っている基本的な試験からOKを動作するようですいくつかのクラッシュ...

クライアントに非同期呼び出しを提供し、そのオプションが利用されている場合、上記の方法を使用することができますか?私がしようとしていることを達成するためのより良い方法はありますか?

達成しようとしているのは、特定のWebサービスとのインターフェイスを可能にするクラスのパッケージです。コードのクライアントは、自分の代理人(自分のクラスが参照する)がどうなるか心配する必要はありません。別のスレッドで呼び出すことができます。 NSUrlConnectionがどのように動作するのかを、私のコードと同じrunloopで呼び出す必要があります。

ありがとうございます! ニック

答えて

0

あなたは「間違った川を上った」と話すことができると思います。一般的に言えば、何か奇妙なことをしない限り、ループを実行することについて心配する必要はありません。マルチスレッド、特にGrand Central Dispatchについて読んでみる必要があるようです。

+0

これを並行NSOperationまたはGCDを使用して実行すると、同じ問題が発生します。 NSUrlConnectionへの非同期呼び出しを直ちに終了するすべての非同期呼び出しが終了するため、NSUrlConnectionは元の実行ループで代理人を呼び出すことができないため、実行ループが心配です。 –

関連する問題