UITableView
不明な数の行でいっぱいのを取得しました。各行には(たとえば3つの)画像が含まれ、アプリケーションはWebサービスからこの情報を収集します。
UITableView
私は無限スクロールを実装しました。テーブルが現在の行数の終わりに近づくたびに、Webサービスへの呼び出しを開始して、次の50行のデータをフェッチします。これscrollViewDidScroll
は、によって呼び出されるメソッドで行いUITableView
ます。
- (void) scrollViewDidScroll:(UIScrollView *)scrollView
{
CGFloat actualPosition = scrollView.contentOffset.y;
float bottomOffset = 450;
if([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad)
bottomOffset = 1000;
CGFloat contentHeight = scrollView.contentSize.height - bottomOffset;
if (actualPosition >= contentHeight && !_loading && !_cantLoadMore)
{
self.loading = YES;
_currentPage++;
NSMutableDictionary* dict = [[NSMutableDictionary alloc] init];
[dict setObject:[NSNumber numberWithInt:_currentPage] forKey:@"page"];
[dict setObject:[_category objectForKey:@"ID"] forKey:@"category"];
[self performSelectorInBackground:@selector(getWallpapersInBackground:) withObject:dict];
}
}
の行の画像UITableView
は遅延読み込みされます。行が表示されている場合は常に、画像が別のスレッドに読み込まれ、画像が完全にダウンロードされると行が更新されます。私が遅延読み込みに使用する原則は、Appleがドキュメントで提案しているものと同じです。画像はローカルにも追加されるNSDictionary
ので、行が画面からスクロールして戻ったときに画像をフェッチできます(そして行が再作成されます)。
1つのビューの画像の量は最大2000〜3000になる可能性があるため、画像をディスクにキャッシュし、NSDictionary
X行以上離れた画像を消去します。ユーザーが上下にスクロールすると、次のようになります。
- 新しい行が表示されます
- 遅延読み込みメソッドが呼び出され、イメージがディスクに存在するかどうか、またはイメージをダウンロードする必要があるかどうかがチェックされます。
- イメージがディスクからダウンロードまたはフェッチされると、コードブロックが実行され、イメージが行に表示されます。インターネットからダウンロードした画像もディスクにキャッシュされます。
UIImage
NSDictionary
手の届く範囲にある必要がある画像のキャッシュを高速化するためにに追加されました。- 表示されている行から15行以上離れた行にある画像は、メモリの問題(メモリ不足エラーの原因となるオブジェクトが
NSDictionary
多すぎる)のために、から削除されます。UIImage
NSDictionary
UITableViewがほぼ終了すると、次のようになります。
- UITableViewは、現在ロードされている行の終わりに近づいています
- 新しい行がたくさんあるWebサービスへの呼び出し(50)
- 新しい行が配列に追加され、
numberOfItemsInSection
メソッドに使用されます。 - Aは、追加の新しい行が
reloadData
確実に入力されるようにするために呼び出されます。UITableView
- 画像を含む新しい行は、上記の手順を実行して画像を遅延読み込みします。
したがって、私が抱えている問題は、Webサービスから新しいレコードを追加するときです。を呼び出すとreloadData
、UITableView
一部の画像がディスクから再度読み込まれ、スクロール中にいくつかのヒックアップが発生します。
私はこれに対する解決策を探しています。insertItemsAtIndexPaths
新しい行の量を使用してそれらをに追加しようとしましたUITableView
が、これにより、遅延読み込みメソッドで既に画像がダウンロードされます(セルが表示されていない場合でも、その時点ですべてのセルが作成されているため、セルが表示されているかどうかを確認します)作成中に表示されると、予期しない結果が発生したり、画像が読み込まれなかったり、セルが奇妙に見えたりします)。
したがって、私が本質的に探しているのは、無限スクロールUITableViewのソリューションです。これは、Web /ディスクから画像を遅延ロードし、写真アプリケーションと同じくらいスムーズです。画像はすべて別々のスレッドに読み込まれるため、スクロールが赤ちゃんの肌ほどスムーズでない理由がわかりません。