2014-12-26 3 views
1

Привет Я разрабатываю приложение IOS. Мое приложение содержит табличное представление с изображением как часть моей таблицы. Я загружаю свое изображение с сервера. Он работает нормально. Но проблема с моим табличным представлением - это когда я просматриваю свой вид таблицы, он начинает мерцать мои изображения. Это означает, что он показывает неправильное изображение в течение некоторого времени через некоторое время, когда он показывает правильные изображения. это поведение продолжается, когда я прокручиваю. Есть ли необходимость в явном вызове любого объекта на nil или выпуске какого-либо объекта ячейки или при хранении некоторых объектов ячейки. Моя ячейка для настольного вида выглядит так:табличный вид с изображениями, загружаемыми с сервера в iphone

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

static NSString *simpleTableIdentifier = @"MediaContentCell"; 

MediaContentCell *cell = (MediaContentCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; 

if (cell == nil) { 
    cell = (MediaContentCell *)[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier]; 
} 

VideoDataModel *videoData = [_mediaContentArray objectAtIndex:indexPath.row]; 

cell.mediaTitle.text = videoData.title; 
cell.mediaSubtitle.text = videoData.shortdescription; 

NSMutableArray *posters = videoData.poster; 

dispatch_queue_t myQueue = dispatch_queue_create("ImageQue",NULL); 
dispatch_async(myQueue,^
{ 
    UIImage *image; 
    if(!posters) 
    { 
     image = [UIImage imageNamed:@"dummyprog_large1.png"]; 
    } 
    else 
    { 
     for(int index = 0 ; index < posters.count; index++) 
     { 
      PosterDataModel *posterData = [posters objectAtIndex:index]; 
      if([posterData.postertype isEqualToString:POSTER_TYPE_LANDSCAPE]) 
      { 
       image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:posterData.posterurl]]]; 
       break; 
      } 
     } 
    } 

    dispatch_async(dispatch_get_main_queue(),^
    { 
     cell.mediaPicture.image = image; 
    }); 
}); 

[cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 

return cell; 
} 

Есть ли кто-нибудь, кто может мне помочь? Нужна помощь. Спасибо.

ответ

3

использование - SDWebImage

 [cell.imageView sd_cancelCurrentImageLoad]; 
    [cell.imageView setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] 
         placeholderImage:[UIImage imageNamed:@"placeholder.png"]]; 

Я использую эту структуру, и его работает отлично для меня.

+0

Эта структура предоставляется самой платформой или мы должны включать ее извне? – nilkash

+0

Мы должны включить его извне. –

+0

Является ли этот проект библиотеки или просто рамкой. Я не могу включить его. Как это сделать? Я парень Android Android, новичок в IOS – nilkash

1
cell.imageView.image = [UIImage imageWithData:yourDefaultImgUrl]; 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     NSData *imageData = [NSData dataWithContentsOfURL:yourServerImageUrl];  
     if (imageData){ 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       UITableViewCell *updateCell = [tableView cellForRowAtIndexPath:indexPath];   
       if (updateCell) 
       updateCell.imageView.image = [UIImage imageWithData:imageData]; 
      }); 
     } 
    }); 

Это поможет вам :)

0

Это механизм повторного использования, который вызывает проблему

Скажем, если ваш вид таблицы имеет 1000 ячеек для отображения и 5 ячеек отображаются на экране в time, iOS создаст только 6 объектов UITableViewCell в памяти.

В вашем коде изображение будет загружено асинхронно из сети, а затем установлено значение [mediaPicture], принадлежащее ячейке по пути указателя, но когда вы просматриваете представление таблицы, из-за механизма повторного использования, [cell.mediaPicture] может быть неправильно связана с указательным путем, и загруженное изображение будет неправильно установлено.

Вы можете посмотреть на этот вопрос о механизме повторного использования:

UITableViewCell - Understanding "reuseable"

И ответ Āmol является именно решение для Вашего случая.

+0

Я также использовал тот же dispatch_asyc. Единственная разница была типа dispatch_queue. Разве что разница? Я использую 'dispatch_queue_t myQueue = dispatch_queue_create (" ImageQue ", NULL);' и Amol, предлагая 'dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)'. Будет ли это иметь значение? Спасибо вам за любезную помощь. Желаю получить более глубокий ответ. Спасибо. – nilkash

+0

Извините за поздний ответ, это не тип очереди, вызывающий вашу проблему, потому что вы не проверяли правильную ячейку перед назначением загруженного изображения, что именно то, что делает код Амола в этом блоке: _UITableViewCell * updateCell = [ tableView cellForRowAtIndexPath: indexPath]; если (обновлениеCell) ..._ –

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