起動時に特定の数のアセットを同期するiOSアプリがあります。私はAFNetworkingを使用しており、すべてのダウンロードを処理するようにNSOperationQueueを設定しています。何回の同時ダウンロードが理にかなっているのだろうかと思っていました。同時に多数必要な場合、ネットワークパフォーマンスが低下する制限はありますか?現在、一度に最大5回のダウンロードを行っています。
4 に答える
これは、いくつかの要因によって異なります。
- ネットワークの速度と遅延はどのくらいですか?
- リクエストとレスポンスのデータサイズは?
- サーバーでのリクエストの処理にかかる時間は?
- クライアントでの応答の処理にはどのくらいの時間がかかりますか?
- サーバーはいくつの並列リクエストを効率的に満たすことができますか?
- 同時に何人のユーザーがリクエストを行いますか?
- ターゲット デバイスの最小速度とメモリ サイズは?
小規模および中規模のアプリケーションの場合、制限要因は通常、デバイスのネットワーク遅延ですが、状況によってはそうではない場合があります。最終的には、テストを行い、最も効率的な妥協案を見つけ出す必要があります。5 は、開始するのに適した数です。利用可能なネットワーク接続 (WLAN または 3G またはそれより遅い...) によって、同時ダウンロードの数を設定したい場合があります。
NSOperationQueues を使用する利点は、それらが基盤となる OS (iOS または OSX) に密接に結びついていることです。キューは、空きメモリ、システムの負荷など、多くの要因に基づいて実行する操作の数を決定します。
システムを推測して自分自身を抑制しようとしないでください。できる限り多くの操作をキューに入れ、OS に処理させます。さまざまなサイズの画像を取得する必要がある場合などに、数百の操作をキューに追加する iPhone アプリがあります。うまく機能し、UI がブロックされないなどです。
編集:まあ、NSURLConnections と同様のネットワーク接続を行うとき、NSOperationQueue は実際にはネットワークの使用にキーインされていないようです。今年の夏、Apple の内部フォーラムで質問したところ、最終的に Quinn "The Eskimo" (Apple ネットワークの第一人者) から 4 のような制限を使用するように言われました。したがって、この投稿は純粋な処理能力という意味で正しいです - NSOperationQueue正しいことをしますが、ネットワーク操作に関しては、制限を設定する必要があります。
あなたのハードウェアに依存しますが、ほとんど私は言うでしょう。これに対処する最善の方法は、複数の試行を伴う複数のケースでテストすることです。テストするハードウェアをできるだけ多様化するようにしてください(これをテストするためにシミュレーターを使用しないことを忘れないでください!)。
実際には、SDKが提供する定数があり、さまざまな制約によって異なります。ぜひご検討ください。
この質問に関して、私は Ipad2 IOS6.0 でいくつかのテストを行いました。Web サーバーへの HTTP-GET 要求を実行する小さなアプリを作成しました。この Web サーバーは 60 秒間データを提供します (これは意味のある結果を得るために、私のテストでは 10 分後にこれを変更します)。
1 つの HTTP-GET リクエストに対しては、非常にうまく機能します。次に、同時にいくつかの HTTP 要求を実行して、IPad の WIFI 接続を介してダウンロードできる数と速度を確認しようとしました
2バージョン作りました。NSOperations を使用する 1 つのバージョンと、Synchron HTTP-GET 要求の NSThread を使用する 1 つのバージョン。要するに、私は常に 6 番目のリクエストでタイムアウトを取得します。( tcp-syn が HTTP サーバーに到達しません )。
追加情報:
NSThead 実装:
for ループを作成し、スレッドを作成するだけです。これにより、同期された HTTP 要求が実行されます。
そこで、6 番目のリクエストが 20 秒後にタイムアウトになっていることがわかります。タイムアウトを 80 秒に設定すると、最初の http リクエストの終了後 (60 秒後) に 6 番目のリクエストが開始されることがはっきりとわかります...
NSOperation 実装:
キューを作成し、maxConcurrentOperations を 12 に設定します。12 の http-request オペレーションをキューに追加します。ここでも、6 番目のリクエストが -1001 エラー コード (つまり timout ) を受け取ることに気付きました。6 番目のリクエストの tcp-syn が表示されません。