8

リンクがNSArrayあります。オンラインの記事抽出API(Clear Read)を使用してそれらを解析し、各記事(一部のHTML)に返される結果を使用して、をにスローしますNSString

私の問題は、配列に100個のURLが含まれている場合、配列をループして各アイテムをAPIに取り込み、JSONでいくつかの結果を取得するという事実から発生します。NSURLConnectionこれは、非同期で一度に100回の呼び出しのように発生します。

それが問題になるかどうかはわかりませんでしたが、100個のURL(実際の文字列、どれもnilではない)を指定すると、返されるデータのJSONキーの値が空になることがよくあります(そうでない場合)。または、戻ってくるデータはnilです。重複もたくさんあります。

現在よりも複数の非同期接続をうまく処理する必要がありますか?もしそうなら、どのように?

4

2 に答える 2

8

いくつかの考え:

  1. 同時非同期要求を実行していて、非同期を使用している場合はNSURLConnection、このダウンロード操作用に独自のクラスを定義して、すべての接続が独自のプロパティを追跡するようにする必要があります。そうすれば、すべてをこのクラス内にカプセル化して、結果のダウンロードオブジェクトがダウンロードされたもの、解析されたものなどを追跡できます。非同期を使用していない場合NSURLConnection(たとえば、を使用している場合dataWithContentsOfURL)、さらに簡単です。NSURLConnection機会を提供および/またはストリーミングする進行状況の更新の一部を失います。

  2. 最高のパフォーマンスを得るには、同時リクエストを実行する必要があります。そうは言っても、特定のサーバーに送信される同時リクエストは4つまたは5つを超えないようにする必要があります。これはiOSが課す制約であり、特にネットワーク接続が遅い場合は、接続がタイムアウトするリスクがあります。

  3. シミュレーターで予備テストを行っている場合は、「ネットワークリンクコンディショナー」を試してみることをお勧めします。これは、AppleDevelopersのダウンロードで入手できる「HardwareIOToolsforXcode」の一部です。遅い接続でのみ現れる問題(特定のサーバーに向かう同時要求が多すぎる場合の前述のタイムアウトの問題など)があります。

  4. そうは言っても、実際のネットワーク速度のデバイスでソリューションをテストすることも忘れないでください。デバイスに対して貪欲すぎるシミュレーターで、超並列タスクを正常に実行するのは簡単です。同時セッションの数を5つに制限すると、このリソースの問題は軽減されますが、テスト戦略の一部にする必要があります。

  5. 私はJRG-Developerに同意します。つまり、 AFNetworkingなどの確立されたフレームワークを調べる必要があります。ただし、100以上の操作をキューに入れる場合はmaxConcurrentOperationCount、のを必ず設定してください。queueAFHTTPClient

  6. 100件のリクエストに必要なデータ量はわかりませんが、アプリの承認プロセスでは、セルラーネットワークで異常なネットワークリクエストを行うアプリを拒否することが知られています。過剰なセルラーネットワークアクティビティを構成するものは、アプリレビューガイドラインに明示的に記載されていませんが、 AppleからのiPhoneアプリ拒否の回避では、5分間で4.5MBを超えないようにする必要があると主張しています。Reachabilityを使用して、使用しているネットワークのタイプを判別し、セルラーを使用している場合(データ量がこのしきい値に近づいた場合)にユーザーに警告することができます。

于 2013-03-24T05:22:55.553 に答える
3

AFNetworkingなどのサードパーティ フレームワークを使用して、一度に発生する非同期呼び出しの数を制限することを検討しましたか? おそらく、これはあなたの問題を解決するのに役立つかもしれません。

特に、ヒットしたエンドポイント (ベース URL) ごとにAFHTTPRequestOperationsを管理するAFHTTPClient(s)networking managerを作成および管理するクラスを作成することを検討してください。

于 2013-03-24T03:41:57.577 に答える