1

ユーザー データをダウンロードするために、データ サーバーに対して複数の URL 要求を行うアプリがあります。10 個のリクエストを並行して行うことで、ダウンロード時間を短縮しようとしています。これを行うためにいくつかの異なる方法を試しましたが、結果として、10 個の要求を (ほぼ) 同時に送信しても、一度に 1 つのデータしか受信できません。これは、すべてのリクエストを連続して行った場合と合計ダウンロード時間は同じであることを意味します。これが私が試したさまざまなことです。

  1. NSURLConnection オブジェクトを持ち、その NSURLConnection のデリゲートとして機能する NSOperation のサブクラスを作成しました。この NSOperation サブクラスの 10 個のインスタンスを NSOperationQueue に追加しました。
  2. 10 個の NSURLConnection オブジェクトを作成し、次々と開始しました。(応答をまっすぐに保つことができるように、個別のデリゲート オブジェクトを使用します。)

どちらの場合も、データを正しくダウンロードするのに問題はありませんが、どちらも期待したほど速くデータを受信しません。サーバーがリクエストに応答するのにかかる時間は、約 0.5 ~ 1.0 秒です。したがって、リクエストが実際に並行して送信される場合、最大 1 秒で 10 件すべてのレスポンスが返されると予想されます。2 つのアプローチの両方で、NSURLConnections がすべて約 5 ミリ秒以内に開始されることを観察しましたが、リクエストの connect:didReceiveResponse メソッドは、リクエストが連続して行われているかのように、約 0.7 秒間隔で次々と呼び出されます。 .

NSURLConnections または NSOperationQueues の仕組みについて誤解していませんか? どんな助けでも大歓迎です。ありがとう!

4

1 に答える 1

0

複数の NSURLConnection を使用して同じサーバーにリクエストを送信している場合、実装した 2 つの方法はほとんど違いがありません。ただし、10 の異なるサーバーに 10 の接続を確立している場合、そのうちの 1 つまたは 2 つが非常に遅く、リクエストへの応答に時間がかかる可能性があります。2番目のアプローチでは、現在のリクエストから応答を取得した後にのみ次のリクエストが送信されますが、最初のアプローチではリクエストが並行して実行されているため、応答を取得するとすぐにリクエストが完了し、次のリクエストがキューに入れられます。この場合、 maximumConcurrentOperation = 1 の場合、両方のアプローチで同じ結果が得られます。

    Approach 2:
<--t1--><--t2--><--t3--><------t4------><--t5--><--------t6--------><--t7--><--t8-->
<----------------------------------Total Time-------------------------------------->

Approach 1: maximumConcurrentOperation = 2

<--t1-->
<--t2-->
        <--t3-->
        <------t4------>
                <--t5-->
                        <--------t6-------->
                        <--t7-->
                                <--t8-->
<--------------Total Time------------------>

これで疑問が解消されることを願っています。

于 2012-06-04T18:59:55.183 に答える