2009-11-10 6 views

答えて

22

同期は、NSURLConnection要求をトリガーし、完了するまで待つことを意味します。

非同期は、NSURLConnectionがデータをダウンロードしている間にリクエストをトリガーして他の処理を実行できることを意味します。

どちらが「ベスト」ですか?

同期は非常に簡単です:同期を確立し、起動し、データが戻ってくるのを待ちます。しかし、アプリケーションがそこに着いて、すべてのデータがダウンロードされるか、何らかのエラーが発生するか、要求がタイムアウトするまで何もしません。少量のデータ以上のものを扱っている場合、ユーザーは待っていますが、ユーザーの利便性を損なうものではありません。

非同期ではもう少し作業が必要ですが、ユーザーがリクエストを処理している間に他の処理を行うことができます。データが入ってくるのを追跡できるようにするデリゲートメソッドをいくつか設定します。これはダウンロードの進行状況を追跡するのに便利です。このアプローチはおそらく、ほとんどの使用例にとっては優れています。

NSURLConnectionで同期要求と非同期要求の両方を実行できます。 Appleのdocumentationは、後者のアプローチに必要な2つのアプローチと代理メソッドを明確に説明しています。

+0

どのように私は接続が同期または非同期を使用して識別することができますか?次の例が表示された場合、 http://developer.apple.com/iphone/library/samplecode/SeismicXML/ あなたはそれが何を使用したかを教えてくれますか?もしconnectionWithRequest:delegate:非同期を参照し、sendSynchronousRequest:returningResponse:error:は同期を参照していますが、NSUrl接続では両方の例を使用していませんでした。 –

10

同期/非同期接続とスレッドを組み合わせているようです。私のアプリでは、スレッド化の代わりに非同期接続を使用しました。

大きなファイルをダウンロードして、UIをフリーズさせたくないとします。 2つの基本的なオプションがあります:

  1. 非同期接続。 + connectionWithRequest:delegate:(または他の非自動解放オプションの1つ)から始まり、興味深いことが起こったときにあなたの代理人を呼び出して、ファイルのビットをダウンロードします。 runloopはまだ動き出しているので、UIは反応的なままです。もちろん、デリゲートが範囲外にならないように注意する必要があります。

  2. 同期。 + sendSynchronousRequest:returningResponse:error:で接続を開始しますが、コードはダウンロードが完了するまで待機します。新しいスレッド(またはCocoaがサポートする上位レベルのスレッド処理の1つ)を生成する必要があります。そうしないと、UIがブロックされます。

どのオプションが「最良」か、または最も苦痛の少ないものは、アプリケーションのアーキテクチャと達成しようとしているものによって異なります。とにかく長時間実行しているプロセス用のスレッドを作成する必要がある場合は、2番目のオプションを使用します。一般的に私は最初のオプションが最も簡単だと言います。

すべてがかなり良いです。documented on Apple's Developer site

3

他の回答に記載されていないものは、リクエストのサイズです。たとえば、大きなファイルをダウンロードしている場合は、非同期接続を使用する方が適しています。代理人は到着時にデータのブロックを受け取ります。比較すると、同期メソッドはすべてのデータを使用可能にするまで待機します。デリゲートは、より早く(より良いユーザーエクスペリエンス)レスポンスの処理を開始したり、メモリの代わりにファイルに保存したりすることができます(リソース使用率の向上)。すべてのデータを待たずに応答を停止することもできます。

基本的に、非同期メソッドを使用すると、接続をより詳細に制御できますが、複雑さを犠牲にします。同期メソッドははるかに簡単ですが、メインのUIスレッドでブロックされるので使用しないでください。

2

ファイルサイズに関するその他の回答に対する回答:ファイルサイズは問題ではないと思います。サーバーが非常に遅く応答し、データの同期をロードしている場合、たとえ3kのような少量のデータを読み込んでいても、UIはフリーズします。

私はあらゆる状況で非同期オプションを使用します。なぜなら、ファイルサイズ、サーバーの応答性、またはネットワークの速度に関して何を得るのか分からないからです。

関連する問題