2014-02-17 55 views
0

我试过搜索,但没有找到任何有用的解决方案。只有当UITableViewcell在屏幕外时,图标下载才会下载图像.iPhone

我正在使用以下代码进行图标延迟加载。 问题是,图标是通过延迟加载下载的,但只有在特定单元格不在屏幕上并且滚动回屏幕时才会看到图标。

我认为这是dequeueReusableCellWithIdentifier的问题,但不知道如何解决它。 图像可以正常下载,但只有在单元格离开屏幕后才能在单元格中看到。

// ------------------------------------------------------------------------------- 
// tableView:cellForRowAtIndexPath: 
// ------------------------------------------------------------------------------- 
- (UITableViewCell *)tableView:(UITableView *)tableVw cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // customize the appearance of table view cells 
    // 
static NSString *CellIdentifier = @"LazyTableCell"; 
static NSString *PlaceholderCellIdentifier = @"PlaceholderCell"; 

// add a placeholder cell while waiting on table data 
NSUInteger nodeCount = [dataArray count]; 

if (nodeCount == 0 && indexPath.row == 0) 
{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:PlaceholderCellIdentifier]; 

    cell.detailTextLabel.text = @"Loading…"; 

    return cell; 
} 


UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (!cell) { 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; 
} 


cell.backgroundColor = [UIColor grayColor]; 

// Leave cells empty if there's no data yet 
if (nodeCount > 0) 
{ 
    // Set up the cell... 
    AppRecord *appRecord = [dataArray objectAtIndex:indexPath.row]; 

    cell.textLabel.text = appRecord.appName; 
    cell.detailTextLabel.text = appRecord.artist; 

    // Only load cached images; defer new downloads until scrolling ends 
    if (!appRecord.appIcon) 
    { 
     if (tableView.dragging == NO && tableView.decelerating == NO) 
     { 
      [self startIconDownload:appRecord forIndexPath:indexPath]; 
     } 
     // if a download is deferred or in progress, return a placeholder image 
     cell.imageView.image = [UIImage imageNamed:@"Placeholder.png"]; 
    } 
    else 
    { 
     cell.imageView.image = appRecord.appIcon; 
    } 

} 

return cell; 
} 


- (void)startIconDownload:(AppRecord *)appRecord forIndexPath:(NSIndexPath *)indexPath 
{ 
IconDownloader *iconDownloader = [imageDownloadsInProgress objectForKey:indexPath]; 
if (iconDownloader == nil) 
{ 
    iconDownloader = [[IconDownloader alloc] init]; 
    iconDownloader.appRecord = appRecord; 
    [iconDownloader setCompletionHandler:^{ 

     UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 

     // Display the newly loaded image 
     cell.imageView.image = appRecord.appIcon; 

     // Remove the IconDownloader from the in progress list. 
     // This will result in it being deallocated. 
     [imageDownloadsInProgress removeObjectForKey:indexPath]; 

    }]; 
    [imageDownloadsInProgress setObject:iconDownloader forKey:indexPath]; 
    [iconDownloader startDownload]; 
} 
} 


- (void)loadImagesForOnscreenRows 
{ 
if ([dataArray count] > 0) 
{ 
    NSArray *visiblePaths = [tableView indexPathsForVisibleRows]; 
    for (NSIndexPath *indexPath in visiblePaths) 
    { 
     AppRecord *appRecord = [dataArray objectAtIndex:indexPath.row]; 

     if (!appRecord.appIcon) 
      // Avoid the app icon download if the app already has an icon 
     { 
      [self startIconDownload:appRecord forIndexPath:indexPath]; 
     } 
    } 
} 
} 

#pragma mark - UIScrollViewDelegate 


- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 
{ 
if (!decelerate) 
{ 
    [self loadImagesForOnscreenRows]; 
} 
} 


- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 
{ 
    [self loadImagesForOnscreenRows]; 
} 
+1

我觉得懒加载[SDWebImage(https://github.com/rs/SDWebImage)是最好的一个。在许多项目中为我工作。 – cjd

+0

是的,我也实现了SDWebmage。但它给出了同样的问题。像cell.imageview.image只在单元格滚动出屏幕时加载。有什么帮助吗? – ScarletWitch

回答

0

我做这样的代码下面,

SDWebImageManager *manager = [SDWebImageManager sharedManager]; 
[manager downloadWithURL:aURL 
       options:0 
       progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished) 
{ 
    if (image) 
     [aCell.imgViewThumb setImage:image]; 

    else 
     [aCell.imgViewThumb setImage:[UIImage imageNamed:@"Dummy-image.jpg"]]; 

    [aCell.indicator stopAnimating]; 
}]; 
相关问题