2013-03-30 2 views
0

У меня есть таблица изображений с небольшим текстом. Как это работает: У меня есть модель, которая принимает ответ JSON от Instagram и помещает все это в набор словарей. В моем методе cellForRowAtIndexPath я установил тег ячейки в indexpath.row, а затем начал загрузку изображения (получение URL-адреса из модели) с помощью dispatch_async. После того, как изображение закончило загрузку, у меня есть проверка, чтобы сравнить тег текущей ячейки и текущего indexpath.row, и если они такие же, изображение будет нарисовано. Он отлично работает, пока я не обновляю свою модель. Простое получение одинаковых перезагруженных данных вызывает странное поведение в таблице - оно отображает первые три ячейки как одни и те же изображения. Как это исправить?Обновление UITableView - неправильные ячейки и одинаковые изображения

Вот мой метод клетки:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 
    cell.tag = indexPath.row; 

    if (self.loader.parsedData[indexPath.row] != nil) 
    { 
     cell.imageView.image = nil; 

     dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul); 
      dispatch_async(queue, ^(void) { 

       NSString *url = [self.loader.parsedData[indexPath.row] objectForKey:@"imageLR"]; 

       if ([self.cache objectForKey:url] != nil) 
       { 
        NSData *imageData = [self.cache objectForKey:url]; 
        self.tempImage = [[UIImage alloc] initWithData:imageData]; 
       } 

       else 
       { 

       NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]]; 
       self.tempImage = [[UIImage alloc] initWithData:imageData]; 
       [self.cache setObject:imageData forKey:[self.loader.parsedData[indexPath.row] objectForKey:@"imageLR"]]; 

       } 
       dispatch_async(dispatch_get_main_queue(), ^{ 
        if (cell.tag == indexPath.row) 
        { 
         cell.imageView.image = self.tempImage; 
         [cell setNeedsLayout]; 
        } 

        }); 
      }); 

    cell.textLabel.text = [self.loader.parsedData[indexPath.row] objectForKey:@"id"]; 
    } 

    return cell; 
} 

Я попытался положить [TableView reloadData] везде, но это не помогает.

ответ

0

Я нашел проблему. Я использовал свойство на TableViewController для хранения загруженных данных. Таким образом, в любой момент различные блоки могут писать в одно и то же время и использовать этот указатель для установки изображений. Что произошло при обновлении, несколько блоков использовали его одновременно, в результате получились одинаковые изображения. Я переключился на использование локальной переменной NSData и теперь работает хорошо.

Смежные вопросы