-1

カスタム UITableViewCell があります。各セルには固有のイメージがあります。

私は画像ローダークラスを持っています。ImageLoader のメソッドに辞書を渡しました。画像の URL とその他の情報で構成された辞書。このコードは、UITableView をゆっくり下にスクロールするとうまく機能します。ただし、下にすばやくスクロールすると、ラグが発生します。アルゴリズムを最適化する必要があります。何か案は。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
  [ImageLoader addImageToQueue:dictionary];
}
4

5 に答える 5

1

このチュートリアルはあなたの質問に答えるのに役立つと思います。スムーズにスクロールできない理由とその修正方法について説明します。

于 2012-05-30T15:29:28.057 に答える
0

ここで、マルチスレッドと GCD に関する Ray Wenderlich のチュートリアルを確認します。

あなたのcellForRowAtIndexPath:またはImageLoaderコードを見ずにそれは難しいですが、私はあなたのImageLoaderがセルを提供する前に完了するのを待たなければならないところまで物事を遅くしているのではないかと疑っています. ディスクから画像を読み取るだけの場合でも、バックグラウンド スレッドで非同期に実行して、メイン スレッドがスムーズなスクロールに集中できるようにする必要があります。

幸運を!

于 2012-05-28T18:10:38.700 に答える
0

これが古いことは知っていますが、次の投稿をお勧めします: http://www.nsprogrammer.com/2013/10/easy-uitableview-buffering.html

于 2013-11-15T18:15:56.000 に答える
0

UITableView dequeueReusableCellWithIdentifierを使用します。

これは基本的に、テーブル セルを毎回ゼロから再作成する必要がないことを意味します。セルに再利用識別子を指定すると、そのセルがメモリに保持され、その識別子に一致するセルを要求したときにセルをデキューできます。

すべてのセルには一意の画像があるため、各セルの一意の識別子を画像から何か (おそらく画像の URL またはファイル名) として設定するのがおそらく最善でしょう。これは、セルを破棄して再作成するよりも多くのメモリを消費しますが、スクロール ラグが減少し、画像が小さい場合、メモリ フットプリントはそれほど大きくありません。

あなたはおそらく次のようなものになるでしょう:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    NSString *imageURL = urlOfImageForThisCell;
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:imageURL];
    if(!cell)
    {
        cell = [self makeNewCell];
        //if your reuseIdentifier is unique to each image, you only ever need to set it's image here
        cell.image = imageForThisCell;

        cell.reuseIdentifier = imageURL;
    }

    //additional cell setup here

    return cell;
}

また、UITableViewCell をサブクラス化し、prepareForReuse をオーバーライドすることも検討してください。

于 2012-05-28T17:39:58.737 に答える