0

カスタム セルを表示するテーブル ビューがあります。セルには、ドキュメント フォルダーから読み込んでいる画像が含まれています。テーブルをスクロールすると、ディスクから画像を読み込んでいるために遅延が発生していると思われます。ただし、その時点で画像は既に読み込まれているため、少し混乱しています。

このコードの最適化に関する提案をいただければ幸いです。遅延読み込みについて読んだことがありますが、これが私に当てはまるかどうかはわかりません。

テーブルがセルを再利用していることを確認しました。

編集:

- (void)configureCell:(BeerCell *)cell 
          atIndexPath:(NSIndexPath *)indexPath 
{
    Beer *beer = (Beer *) [self.fetchedResultsController objectAtIndexPath:indexPath];
    cell.displayBeerName.text = beer.name;

    // check to see if there is a cached image already.  Use a dictionary.
    // make sure this is one of your ivars
    __block UIImage *theImage = [self.imagesCache objectForKey: beer.imagePath];

    // If the image is not in your cache, you need to retrieve it.
    if (!theImage){
        // The image doesn't exist, we need to load it from disk, web or render it

        // First put a placeholder image in place.  Shouldn't be any penalties after the 
        // first load because it is cached.
        cell.beerImage.image = [UIImage imageNamed:@"beer-pic.png"];

        // check to see if your image cache dictionary has been created, if not do so now
        if (_imagesCache == nil) {
            _imagesCache= [[NSMutableDictionary alloc] initWithCapacity:1];
        }

        // get a weak reference to UITableViewController subclass for use in the block
        // we do this to avoid retain cycles
        __weak BeerListViewController *weakSelf = self;

        // do the heavy lifting on a background queue so the UI looks fast
        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
        dispatch_async(queue, ^ {

            theImage = [UIImage imageWithContentsOfFile:beer.imagePath];

            // I added this in because I create the new core data object in this class, and pass
            // it to the class where I fill out the information about the beer
            if (theImage) {

                // Add the image to the cache
                [weakSelf.imagesCache setObject:theImage forKey:beer.imagePath];
                //[weakSelf.imagesCache addObject:theImage forKey:beer.imagePath];

                // Check to see if the cell for the specified index path is still being used
                BeerCell *theCell = (BeerCell *)[weakSelf.tableView cellForRowAtIndexPath:indexPath];
                // Per the docs. An object representing a cell of the table
                //  or nil if the cell is not visible or indexPath is out of range.
                if (theCell){
                    // dispatch onto the main queue because we are doing work on the UI
                    dispatch_async(dispatch_get_main_queue(), ^ {
                        theCell.beerImage.image = theImage;
                        [theCell setNeedsLayout];
                    });
                }
            }
        });
    }        
    else
    {
        // Image already exists, use it.
        cell.beerImage.image = theImage;
    }
}
4

3 に答える 3

0

これらの 2 つのリンクのいずれかが、これが適切に行われる方法をよりよく説明しています。

https://developer.apple.com/library/ios/#samplecode/LazyTableImages/Introduction/Intro.html (公式アップル)

https://github.com/rs/SDWebImage (使用するのに最適なライブラリ)..

于 2012-07-05T15:41:04.387 に答える
0

cellForRowAtIndexPath:テーブルビューをスクロールするたびに呼び出されます...そのため、このメソッドに大きな処理コードを記述すると、スクロールがハングする可能性があります。したがって、可能であれば画像の配列を作成し、サムネイル画像を使用してください....次に、それらの画像を配列からセルに追加します。スクロールがスムーズになること間違いなしです。

于 2012-07-05T15:45:21.227 に答える