0

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;



}

現在のアプリは次のようになります。

ここに画像の説明を入力

解決:

やっと見つけたこのクラスで作業しました。 https://github.com/rs/SDWebImage これは、キャッシュ、非同期ダウンロードを処理します。これをもっと早く見つけたかった..

4

1 に答える 1

1

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];
}
于 2013-03-15T06:43:24.100 に答える