UITableView与Json文件,加载图像到单元格消失

时间:2013-03-15 03:16:16

标签: ios json image uitableview

我正在使用由http://www.markj.net/iphone-asynchronous-table-image/

提供的asyncimageview类

我从json文件获取图像URL并将每个图像加载到单元格。

问题:

当我向上滚动并向下滚动到同一个单元格时,图像会重新加载(消失并再次出现)。我无法弄清楚为什么图像不断重新加载?有没有人有建议或解决方法我怎么能让它停止?提前谢谢!

   // Asks the data source to return a cell to insert in a particular table view location

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{


    //Gets the current news article
    NewsArticle *theCurrentArticle = [self.listofNewsArticles objectAtIndex:[indexPath row]];

    //Gets the title from the current article
    NSString *theTitle = theCurrentArticle.title;

    //Gets the image url 
    NSString *imageUrl = theCurrentArticle.imageURL;

    //Gets the description of the current news article
    NSString *theDescription = theCurrentArticle.description;


    NewsCustomCell *cell = (NewsCustomCell *)[tableView dequeueReusableCellWithIdentifier:@"NewsContent"];

    __block NewsCustomCell *aCell;

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    if (cell == nil) {
        aCell = (NewsCustomCell *)[tableView dequeueReusableCellWithIdentifier:@"NewsContent"];
    } else {
        AsyncImageView* oldImage = (AsyncImageView*)
        [cell.contentView viewWithTag:999];
        [oldImage removeFromSuperview];
    }



    AsyncImageView *imageView = [[AsyncImageView alloc] initWithFrame:CGRectMake(5, 5, 100, 100)];
    imageView.tag = 999;

          dispatch_async(dispatch_get_main_queue(), ^{
    [imageView loadImageFromURL:[NSURL URLWithString:imageUrl]];
    [cell.contentView addSubview:imageView];

              cell.titleLabel.text = theTitle;
              cell.descriptionLabel.text = theDescription;
              cell.imageLabel.contentMode = UIViewContentModeScaleAspectFill;

});

         });



    return cell;



}

看看当前的应用程序是什么样的:

enter image description here

解决方案:

我终于找到了这堂课。 https://github.com/rs/SDWebImage 这可以处理缓存,异步下载。希望我早点发现这个......

1 个答案:

答案 0 :(得分:1)

我希望您有Write AsyncImageView和ImageCache以及ImageCacheObject类。 将此代码写入cellForRowAtIndexPath:

    static NSString *CellIdentifier = @"CellIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) 
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    Quest_Forum *Quest_ForumObj=[queArr objectAtIndex:i+indexPath.row];
  //  NSLog(@"cell for row at... i val.. %d",i+indexPath.row);

    for(UIView * view in cell.contentView.subviews){
        if([view isKindOfClass:[AsyncImageView class]])
        {
           // NSLog(@"remove old images");
            [view removeFromSuperview];
            view = nil;
        }
    }

    AsyncImageView *asyncImageView = nil;

    UIImageView *cellImage = (UIImageView *)[cell viewWithTag:1]; // Inside tableview i have taken tableviewcell and given tag 1 to that imageview

    asyncImageView = [[AsyncImageView alloc] initWithFrame:cellImage.frame] ;
    [asyncImageView loadImageFromURL:Quest_ForumObj.Quest_Image];
    asyncImageView.backgroundColor=[UIColor clearColor]; 
    [cell.contentView addSubview:asyncImageView];


    UILabel *lblQuest = (UILabel *)[cell viewWithTag:2]; // Given tag 2 to the label inside tableViewCell
    lblQuest.text=Quest_ForumObj.Question;

在ImageCacheObject.h中

@class ImageCacheObject;

@interface ImageCache : NSObject 
{
    NSUInteger totalSize;  // total number of bytes
    NSUInteger maxSize;    // maximum capacity
    NSMutableDictionary *myDictionary;
}

@property (nonatomic, readonly) NSUInteger totalSize;

-(id)initWithMaxSize:(NSUInteger) max;
-(void)insertImage:(UIImage*)image withSize:(NSUInteger)sz forKey:(NSString*)key;
-(UIImage*)imageForKey:(NSString*)key;

在ImageCacheObject.m中

#import "ImageCacheObject.h"

@synthesize totalSize;

-(id)initWithMaxSize:(NSUInteger) max  
{
    if (self = [super init]) 
    {
        totalSize = 0;
        maxSize = max;
        myDictionary = [[NSMutableDictionary alloc] init];
    }
    return self;
}

-(void)dealloc // Don't write this method if you are using ARC 
{
    [myDictionary release];
    [super dealloc];
}

-(void)insertImage:(UIImage*)image withSize:(NSUInteger)sz forKey:(NSString*)key
{
   // NSLog(@"count of insert image%d",sz);
    ImageCacheObject *object = [[ImageCacheObject alloc] initWithSize:sz Image:image];
    while (totalSize + sz > maxSize) 
    {
        NSDate *oldestTime;
        NSString *oldestKey;
        for (NSString *key in [myDictionary allKeys]) 
        {
            ImageCacheObject *obj = [myDictionary objectForKey:key];
            if (oldestTime == nil || [obj.timeStamp compare:oldestTime] == NSOrderedAscending) 
            {
                oldestTime = obj.timeStamp;
                oldestKey = key;
            }
        }
        if (oldestKey == nil) 
            break; // shoudn't happen
        ImageCacheObject *obj = [myDictionary objectForKey:oldestKey];
        totalSize -= obj.size;
        [myDictionary removeObjectForKey:oldestKey];
    }
    [myDictionary setObject:object forKey:key];
    [object release];
}

-(UIImage*)imageForKey:(NSString*)key 
{
    ImageCacheObject *object = [myDictionary objectForKey:key];
    if (object == nil)
        return nil;
    [object resetTimeStamp];
    return object.image;
}

在ImageCacheObject.h中

@interface ImageCacheObject : NSObject 
{
    NSUInteger size;    // size in bytes of image data
    NSDate *timeStamp;  // time of last access
    UIImage *image;     // cached image
}

@property (nonatomic, readonly) NSUInteger size;
@property (nonatomic, retain, readonly) NSDate *timeStamp;
@property (nonatomic, retain, readonly) UIImage *image;

-(id)initWithSize:(NSUInteger)sz Image:(UIImage*)anImage;
-(void)resetTimeStamp;

在ImageCacheObject.m中

@synthesize size;
@synthesize timeStamp;
@synthesize image;

-(id)initWithSize:(NSUInteger)sz Image:(UIImage*)anImage
{
    if (self = [super init]) 
    {
        size = sz;
        timeStamp = [[NSDate date] retain];
        image = [anImage retain];
    }
    return self;
}

-(void)resetTimeStamp 
{
    [timeStamp release];
    timeStamp = [[NSDate date] retain];
}

-(void) dealloc 
{
    [timeStamp release];
    [image release];
    [super dealloc];
}