11

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になる可能性があるため、画像をディスクにキャッシュし、NSDictionaryX行以上離れた画像を消去します。ユーザーが上下にスクロールすると、次のようになります。

  1. 新しい行が表示されます
  2. 遅延読み込みメソッドが呼び出され、イメージがディスクに存在するかどうか、またはイメージをダウンロードする必要があるかどうかがチェックされます。
  3. イメージがディスクからダウンロードまたはフェッチされると、コードブロックが実行され、イメージが行に表示されます。インターネットからダウンロードした画像もディスクにキャッシュされます。
  4. UIImageNSDictionary手の届く範囲にある必要がある画像のキャッシュを高速化するためにに追加されました。
  5. 表示されている行から15行以上離れた行にある画像は、メモリの問題(メモリ不足エラーの原因となるオブジェクトがNSDictionary多すぎる)のために、から削除されます。UIImageNSDictionary

UITableViewがほぼ終了すると、次のようになります。

  1. UITableViewは、現在ロードされている行の終わりに近づいています
  2. 新しい行がたくさんあるWebサービスへの呼び出し(50)
  3. 新しい行が配列に追加され、numberOfItemsInSectionメソッドに使用されます。
  4. Aは、追加の新しい行がreloadData確実に入力されるようにするために呼び出されます。UITableView
  5. 画像を含む新しい行は、上記の手順を実行して画像を遅延読み込みします。

したがって、私が抱えている問題は、Webサービスから新しいレコードを追加するときです。を呼び出すとreloadDataUITableView一部の画像がディスクから再度読み込まれ、スクロール中にいくつかのヒックアップが発生します。

私はこれに対する解決策を探しています。insertItemsAtIndexPaths新しい行の量を使用してそれらをに追加しようとしましたUITableViewが、これにより、遅延読み込みメソッドで既に画像がダウンロードされます(セルが表示されていない場合でも、その時点ですべてのセルが作成されているため、セルが表示されているかどうかを確認します)作成中に表示されると、予期しない結果が発生したり、画像が読み込まれなかったり、セルが奇妙に見えたりします)。

したがって、私が本質的に探しているのは、無限スクロールUITableViewのソリューションです。これは、Web /ディスクから画像を遅延ロードし、写真アプリケーションと同じくらいスムーズです。画像はすべて別々のスレッドに読み込まれるため、スクロールが赤ちゃんの肌ほどスムーズでない理由がわかりません。

4

2 に答える 2

16

私があなたの質問の完全性を完全に理解したかどうかはわかりませんが、同様の問題に直面したときに私がしたことをいくつか示します。

  • -tableView:cellForRowAtIndexPath:Webからより多くのデータをロードするための手がかりとして使用しました。indexPath.row + 10 >= self.data.countより多くのデータをロードするときに、番号(私の場合は10)を選択しました。

    • -tableView:cellForRowAtIndexPath:とにかく電話する必要がありました。
    • のよりタイトなループにコールバックを強制しませんでした-scrollViewDidScroll:
  • UIImageView呼び出した画像の読み込みを非同期化するクラスでサブクラス化しましたURLImageView

    • で、インスタンス-tableView:cellForRowAtIndexPath:にURLを割り当てました。URLImageView
    • その割り当てにより、ディスクからロードするかWebからロードするバックグラウンド操作が発生しました。
    • 操作はキャンセル可能だったので、ロードする必要がなくなった画像の作業を続けませんでした。

数百(数千ではない)の画像を含むテーブルビューがありました。画面には一度に2つまたは3つのテーブルセルしかありませんでした。

  • 私が使用-refreshDataした:それはチャンピオンのように働いた。
  • URLImageView画像をフェードインすることもできました。とてもいい効果でした。

それがお役に立てば幸いです。

于 2012-06-30T23:58:56.203 に答える
2

ちらつきを避けるためbeginUpdatesに、テーブルを呼び出してから、insertrowAtIndexPaths:withRowAnimations:で終了してendUpdatesください。

幸運を。

于 2015-04-05T11:36:48.687 に答える