2013-05-16 2 views
0

Я получаю изображения асинхронно с синтаксическим разбором, и я вставляю их в массив с некоторыми другими вещами.Обновить таблицуView при асинхронном обращении изображений

я вернуть этот массив, чтобы заполнить Tableview, а строка имеет UIImageView, но некоторые изображения, которые я получаю асинхронно делаю загружался, когда я заполнить таблицу с массивом в cellForRowAtIndexPath, поэтому, когда я первый смотреть Tableview, я получите строки с пустым изображением в ячейке, пока я не переместим прокрутку в таблицеView, так что cellForRowAtIndexPath вызывается снова, и те изображения, которые были установлены в массиве, уже загружены.

Я получаю изображения также, если я делаю IBAction с [self.tableView reloadData];. Я получаю изображения.

Проблема в том, что я возвращаю ячейку inmediatelly, и изображение не загружается. Я использую собственный TableViewCell. Я нашел что-то около "AsyncImageView", чтобы загрузить изображение, но я не знаю как.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
    //Get the game for the row 
    GameModel *game = [self.currentMatches objectAtIndex:indexPath.row]; //HERE i load the images 

    MatchCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"GameCell" forIndexPath:indexPath]; 

    cell.userImage.image = game.avatarp1; //I set the image to the cell but isnt loaded yet 

    //If i do this WORKS but i get 2 times the same image (on the game and now) (its a function that i created, that seems is calling tableView or so when assigns the image to the cell, i dont understand why it works 
     [ParseModel getAvatarWithUser:game.p1 completionBlock:^(UIImage *avatar) { 
      cell.userImage.image = avatar; 
     }]; 
+0

просто сделайте это [yourtableView reloadData]; –

ответ

0

Что делать, если вы установите nil изображение, когда вы получаете dequeueReusableCell, а затем пусть блок установить изображение?

Просто измените это:

cell.userImage.image = game.avatarp1; 

Для этого:

cell.userImage.image = nil; 

А потом пусть этот код работает (я понял ваш ответ, что это хорошо работает)

[ParseModel getAvatarWithUser:game.p1 completionBlock:^(UIImage *avatar) { 
     cell.userImage.image = avatar; 
}]; 

Надеюсь, поможет!

+0

Проблема в том, что я установил изображения в массив (ВСЕ изображения), а затем я должен сделать это [ParseModel getAvatar .., и загрузить AGAIN то же изображение (2 раза). чтобы назначить нуль изображению. – Godfather

0

Вы можете использовать «SDWebImage» в качестве альтернативы «AsyncImageView», о котором вы упомянули в своем вопросе. Его очень легко реализовать. Я привел пример моего собственного кода, где я загружаю изображение из URL-адреса в ячейке так же, как вы пытаетесь. (Изменить мой «вид» для cell.userImage)

Этот метод помещает временный файл (заполнитель и, когда изображение полностью загружен, он Automaticlly изменения (без перезагрузки или свитка).

- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view 
{ 
    if (view == nil) 
    { 
     view = [[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 238.0f, 289.0f)] autorelease]; 
     //here is where you put a placeholder and download in the background the image with an URL. Items is an array of URLs 
     [(UIImageView *)view setImageWithURL:[items objectAtIndex:index] 
       placeholderImage:[UIImage imageNamed:@"placeholder.png"]]; 
     view.contentMode = UIViewContentModeScaleAspectFit; 
    } 
    return view; 
} 

Когда вы добавили SDWebImage в свой проект, не забудьте добавить в свой .m: #import < SDWebImage/UIImageView + WebCache.h>

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