我有一个显示自定义单元格的表格视图,这些单元格包含我从文档文件夹加载的图像。我注意到,当我滚动表格时,会有一些滞后,我假设这是从磁盘加载图像。但是,图像已经加载,所以我有点困惑。
有关优化此代码的建议,将不胜感激。我已阅读有关延迟加载的信息,但我不确定这是否适用于我。
我确实检查过以确保表格正在重用单元格。
编辑:
- (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;
}
}