UITableview を実行して webservice という名前のデータをダウンロードするのは非常に高速なので、それを使用して最初にテーブルにデータを入力し、次にイメージの操作キューを開始します。
次に、残りのデータ用の個別のキューが非常に遅くなりますが、それは画像の読み込み時間に影響します.2つを同時に行うにはどうすればよいですか.
何がパフォーマンスを低下させているのかを突き止めて、それを修正するのを手伝ってもらえますか?
UITableview を実行して webservice という名前のデータをダウンロードするのは非常に高速なので、それを使用して最初にテーブルにデータを入力し、次にイメージの操作キューを開始します。
次に、残りのデータ用の個別のキューが非常に遅くなりますが、それは画像の読み込み時間に影響します.2つを同時に行うにはどうすればよいですか.
何がパフォーマンスを低下させているのかを突き止めて、それを修正するのを手伝ってもらえますか?
ご存じのとおり、maxConcurrentOperationCount
キューを作成するときに設定することで、同時リクエストの数を指定できます。4 は典型的な値です。
self.imageDownloadingQueue.maxConcurrentOperationCount = 4;
問題は、(iOS の制限といくつかのサーバーの制限の両方のため) それ以上大きくすることはできないということです。おそらく5つですが、それより大きくはありません。
個人的には、テキスト値を返す制限された最大同時操作数を使い果たすことはありません。私はそれらすべてを前もって取得します。画像は非常に大きいため、遅延読み込みを行いますが、テキスト エントリは非常に小さいため、個別のネットワーク リクエストを実行するオーバーヘッドにより、パフォーマンスが低下し始めます。説明の遅延読み込みを行う場合は、50 または 100 程度のバッチでダウンロードします。
ソース コードを見ると、少なくとも、本来の 2 倍の JSON リクエストを行っています (同じ JSON をgetAnimalRank
とで取得しています)。getAnimalType
)。ただし、最初の JSON 要求を変更して、名前、ランク、タイプ、URL (画像自体は除く) など、必要なものすべてを返すようにする必要があります。次に、1 回の呼び出しで、必要なものすべてを取得します (画像は除きます。画像は非同期で取得され、サーバーは UX に対して十分高速に配信されます)。また、ランク/タイプ/URL の個々の要求を保持することにした場合は、サーバー コードを確認する必要があります。これは、すぐに返されるべきではない正当な理由がなく、現在非常に遅いためです。しかし、私が言ったように、最初の JSON 要求でそれらすべてを返すだけで、ユーザー インターフェイスは非常に高速になります。
最後のポイント: 詳細と画像のダウンロードに別々のキューを使用しています。NSOperationQueue
使用および設定の全体的な目的maxConcurrentOperationCount
は、iOS が特定のサーバーで 5 つの同時要求しか実行できないことです。これらを 2 つの別々のキューに入れることで、 の利点が失われますmaxConcurrentOperationCount
。リクエストがタイムアウトするまでに 1 分かかることが判明したため、おそらく問題は発生しませんが、それでも、キューの目的に関する基本的な誤解が反映されています。
要するに、ネットワーク キューは 1 つだけにする必要があります (システムの制限は、デバイスと特定のサーバー間のネットワーク同時接続の数であり、画像のダウンロード数ではなく、個別に説明のダウンロード数であるためです)。
これを非同期に行うことを考えましたか?ブロックを使用して説明したことと非常によく似たクラスを作成しました。これを行うには、次の 2 つの方法があります。
cellForRowAtIndexPath が起動するたびに非同期でロードするだけです。これは多くの状況で機能しますが、正しい画像の読み込みが完了するまでの間、間違った画像が表示される可能性があります。
ドラッグが停止したら、プロセスを呼び出して画像を読み込みます。これは通常、正しい画像が常に正しい場所に表示されるようにするための方法です。画像が Web から読み込まれるまでは、プレースホルダー画像を使用できます。
詳細については、この SO の質問を参照してください。