2

そのため、バックグラウンド スレッドでデータをダウンロードするすべての REST 呼び出しを実行して、UI の応答性を維持しようとしています。

NSOperationQueue を含むビューコントローラーがあります。NSOperation のサブクラスであるインポーター クラスのインスタンスを作成します。インポーターの main() メソッド内で、ASIHTTPDataRequest を設定しています。リクエストを作成したら、リクエストを開始します。

問題: リクエストで「startAsynchronous」を呼び出してリクエストを開始すると、問題が発生しました。デリゲート コールバックが呼び出されることはありません。リクエストが開始され、そのデータがダウンロードされますが、デリゲート コールバック メソッドが呼び出されることはありません。

私の解決策:リクエストを同期的に開始すると、すべてが正常に機能するようです(つまり、コールバックなど)。これは正しい解決策ですか?

同期呼び出しが機能するのに、非同期呼び出しが機能しないのはなぜですか? Apple の「TopSongs」サンプルを参考にして、インポーター クラスをモデル化しています。

4

2 に答える 2

6

メイン スレッドから実行する場合、ASIHTTPRequest 自体が UI をブロックすることはありません。

  • ASIHTTPRequest は、バックグラウンド スレッドから実行するようには設計されていません。[ASIHTTPRequest requestFinished]は、メイン スレッドで「終了」コールバックを呼び出します。バックグラウンド スレッドによって受信されることはないため、バックグラウンド スレッドの実行ループは実行されません。
  • とにかく、ASIHTTPRequest は NSOperationです。これは実装の詳細です。
  • ASIHTTPRequest は、デフォルトでネットワーク コードをバックグラウンド スレッドで実行するため、別のスレッドに貼り付けてもあまりメリットが得られない可能性があります。

長い時間がかかるデータの解析を行っている場合は、それを操作に含めます。

于 2010-08-12T19:58:57.363 に答える
1

メソッドのmain()実行が終了すると、NSOperation 終了して解放されるように設定されるため、デリゲートが解放されるため、より新しいデリゲート コールバックを受け取ります。

于 2010-08-12T15:41:58.747 に答える