2

NSURLConnectionを使用してデータをダウンロードするNSOperationがありますが、次のようになります。

....
- (void)main
{
....
   while (!self.isCancelled && !self.isLoaded)
   {
      [NSRunloop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NDate distantFutute]];
   }
....
}

問題は、接続がハングすることがあり、他のソースが起動していないため、ループが永久に実行され続け、操作をキャンセルする機会がないことです。私の操作キューには1つの操作の制限があるため、すべてがほとんど行き詰まっています。

問題は、この問題に対する最善の解決策は何かということです。

  1. distantFutureの代わりに、0.5秒などの短い時間を使用します。(おそらく余分なCPUサイクルを食べるでしょう)
  2. 実行中のスレッドへの参照をivarに保存し、operartionのcancelメソッドのスレッドでperformselectorを介して実行ループをくすぐるようにしてください。(すでに終了していて実行されなくなる実行ループでセレクターをキューに入れると、状況が発生する可能性があります。これにより、私が知る限り、リークが発生します)

または多分別の方法がありますか?

4

1 に答える 1

3

ハイブリッドアプローチは次のとおりです。

  • データがロードされるのを待つことができる最長の時間、実行ループを実行します(beforeDate:[NSDate dateWithTimeIntervalSinceNow:kConnectionMaxWaitSeconds])。
  • バージョン0の実行ループソース(CFRunLoopSourceCreate)を作成し、待機を開始する前に実行ループに追加します。
  • メソッドに、実行ループの-cancelソース(CFRunLoopSourceSignal)とウェイクアップ()を通知させます。CFRunLoopWakeUp
于 2009-11-22T00:23:12.227 に答える