iOS 用の RSS リーダー アプリを作成しています。フィード内の記事のリストを含む tableView があります。その tableView の各セルには、画像 (記事のサムネイル) が含まれます。最も効果的な方法でロードしたい:
- 最も優先度が高いのは、表示されているサムネイルです。
- 表示されているサムネイルが適切な順序 (上から下) で読み込まれるとよいでしょう。
- 非表示のサムネイルもプリロードする必要があります。ただし優先度は最低。
- 非表示のサムネイルの読み込み順序が次のようになるとよいでしょう: 最も近い (上と下の両方から) 表示されているセルから最も遠いセルへ。
- tableView がスクロールするたびに、セルは可視性と可視領域までの距離に基づいて読み込みの優先度を更新する必要があります。
私はどのアプローチを使用するかについて少し立ち往生しています。一番難しいのは(5)です。アプリは狭い帯域幅の条件で使用される可能性が高いため、必要です。そのため、アプリは低速の接続速度を最大限に活用する必要があります。
今のところ、画像の読み込み用に NSOperationQueue があります。maxConcurrentOperationCount は 2 です。読み込み中の NSOperations は (Apple の用語では) 非並行です。つまり、別々のスレッドで実行されます。各 NSOperation は、単なる同期 NSData の initWithContentsOfURL です。このアプローチの問題は、すでに実行中の読み込み操作を制御できないことです。それらをイベントキャンセルすることはできません!
いつでもすべての(すでに実行中を含む)ロード操作の優先度を変更できれば理想的です。そこで、非同期の NSURLConnection をロードする同時 (Apple の用語で) NSOperations に切り替えることを考えています。didReceiveData の間の isCancelled prop を見て、操作をキャンセルできるようにします。優先度が下げられた操作のキャンセルを使用する予定です。操作によって既に読み込まれたデータを保存し、キャンセルし、新しい (より低い) 優先度でキューに追加して、ダウンロードを再開します。ロード タスクは CPU を集中的に使用せず、遅延が大きくなる可能性が高いため、同時 (Apple の用語で) 操作によって UI が遅くならないことを願っています。
また、操作の優先順位をどうするかがわかりません。NSOperationQueuePriority には可能な値が 5 つしかないためです。つまり、見える (上から下へ) サムネイルと見えない (近くから遠くへ) サムネイルをロードする順序を維持する方法は?
お知らせ下さい)