tableView在单元格上加载旧图像

时间:2016-01-24 16:01:42

标签: ios objective-c uitableview

我有一个表视图,当用户滚动底部时加载新行。这是代码:

@implementation MainViewController{

    short currentIndex;
    NSNumber *currentPage;
    MyCell *cell;
}


- (void)viewDidLoad {

    [super viewDidLoad];

    NSLog(@"bam bam?");

    // Setting ivars

    currentPage = @(1);

    // Центр уведомлений. Подписываемся на уведомления чтобы знать, когда нужно обновить табличку.
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reloadNotification:) name:@"updateTable" object:nil];

    [self loadNews];
}

-(void)reloadNotification: (NSNotification*) notification{

    NSLog(@"Recieved notify");
    [self.tableView reloadData];
}



-(void)loadNews{

    //    page=1&limit=5&order_by=created_at&order=desc

    [[MedsolutionAPI sharedInstance] getNewsWithParameters:self.parameters :^(NSMutableArray *newsArray) {

        self.dataArray = newsArray;
    }];

}


#pragma mark - table view delegate

// Метод который вызывается при нажатии на ячейку. Используем его для вызова метода performSegueWithIdentifier и сохранения текущего индекса.

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    currentIndex = indexPath.row;

   // [self performSegueWithIdentifier:@"detail" sender:self];


}

// Высота ячейки

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{

    return 100;
}



-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{

    return 1;
}

// Метод определяющий количество ячеек (соответствует количеству объектов массива objectsArray

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

    return [self.dataArray count];;
}

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

    // Инициализация ячейки


    cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

    // Получаем объект по соответствующему индексу

    NewsParseer *news = [self.dataArray objectAtIndex:indexPath.row];

    // Заполняем ячейку

    cell.titleLabel.text = news.title;

    cell.dateLabel.text = news.created_at;

    // Загружаем изображение с помощью метода загрузки изображений библиотеки AFNetworking

    [cell.myImageView setImageWithURL:[NSURL URLWithString:news.standardImage]];


    return cell;
}

 // Вызывается когда пользователь скролит вниз, для подгрузки новых ячеек

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
    NSInteger currentOffset = scrollView.contentOffset.y;
    NSInteger maximumOffset = scrollView.contentSize.height - scrollView.frame.size.height;

    if (maximumOffset - currentOffset <= -40) {
        NSLog(@"reload");

        // Add task

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{

            /* Создаем свою группу */

            dispatch_group_t myGroup = dispatch_group_create();

            /* Реализуем задачи в группе */

            dispatch_group_enter(myGroup);

            /* Имплементация */


            currentPage = [NSNumber numberWithInt:[currentPage intValue] + 1];

            [[MedsolutionAPI sharedInstance] getNewsWithParameters:self.parameters :^(NSMutableArray *newsArray) {

                    [self.dataArray addObjectsFromArray:newsArray];

            }];

            dispatch_group_leave(myGroup);

            dispatch_group_wait(myGroup, DISPATCH_TIME_FOREVER);




        });

    }
}

#pragma mark - setters & getters

-(NSDictionary*)parameters{

    return  @{@"page": currentPage, @"limit" : @"5", @"order_by" : @"created_at", @"order":@"desc" };
}

MyCell.m我写道:

-(void)prepareForReuse{

   [self.myImageView cancelImageRequestOperation];

}

我的问题是 - 当我加载新行时,我可以看到&#34; old&#34;细胞上的图像。这是常见的错误,但在以前的项目中,它很容易用

解决

[self.myImageView cancelImageRequestOperation];

当我改变MyCell类的实现时:

-(void)prepareForReuse{

    // Для избежания подгрузки неверных изображений, когда таблица пытается загрузить ячейки которые уже были использованны.

    self.dateLabel = nil;
    self.titleLabel = nil;
    self.myImageView = nil;

    [self.myImageView cancelImageRequestOperation];

}

新图片停止加载,而不是它始终显示&#34; old&#34;图像。

1 个答案:

答案 0 :(得分:0)

可以尝试使用以下代码..

-(void)prepareForReuse{
// Для избежания подгрузки неверных изображений, когда таблица пытается загрузить ячейки которые уже были использованны.

self.dateLabel = nil;
self.titleLabel = nil;

[self.myImageView cancelImageRequestOperation];
self.myImageView = nil;

}