2014-01-09 3 views
2

Я могу получать изображения асинхронно на uitableview.i, получая эти изображения из url.on, прокручивая uitableview, эти изображения исчезают, и им требуется время для загрузки снова, а иногда они Dont нагрузки на all.i не хотят использовать любые 3 участника libraries.i не хотят идти с синхронным approach.please предложить любой правильный подход к улучшению performance.thanks помощи в advance.my код ниже:асинхронно загруженные изображения в uitableview исчезают при прокрутке вверх

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
static NSString *[email protected]"cell"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier]; 
if (cell == nil) { 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"identifier"]; 
} 
UIImageView *imgVw=[[UIImageView alloc]initWithFrame:CGRectMake(250, 10, 40, 30)]; 
[cell.contentView addSubview:imgVw]; 
Attributes *att = [listOfObjects objectAtIndex:indexPath.row]; 
[email protected]"http:image url"; 
strImgName=att.classifiedImg; 
if (strImgName == nil) { 
    UIImage *myImg=[UIImage imageNamed:@"user_circle.png"]; 
    imgVw.image=myImg; 
} 
else{ 
    strImg=[strImgUrl stringByAppendingString:strImgName]; 
} 
dispatch_async(dispatch_get_global_queue(0,0), ^{ 
    NSData *data = [[NSData alloc] initWithContentsOfURL: [NSURL URLWithString:strImg]]; 
    if (data == nil) 
     return; 
    dispatch_async(dispatch_get_main_queue(), ^{ 

     UIImage *img=[UIImage imageWithData: data]; 
     imgVw.image=img; 
    }); 

}); 



return cell; 
} 
+0

Не использовать проверенный участник lib означает, что вам нужно написать все то, что вы понимаете и не понимаете, его не очень умный способ найти одно и то же колесо – Retro

ответ

2

UITableViews предназначены для повторного использования ячеек. При прокрутке вверх, например, первая ячейка может повторно использоваться, чтобы показать 5-ю ячейку, так как первый из них теперь выключен. Когда вы прокручиваете назад, cellForRowAtIndexPath вызывается снова, и вы снова загружаете одно и то же изображение. Если вы хотите, чтобы он мгновенно загружался, вам нужно будет кэшировать изображения после их загрузки в первый раз, поэтому в следующий раз, когда потребуется изображение, вы можете напрямую извлечь его из кеша.

Многие сторонние библиотеки делают это (AFNetworking), но если вы не хотите их использовать, вам придется кэшировать изображения вручную.

0

Кажется, что ваш код повторного использования содержит ошибку, которая вызывает каждый раз создание новых ячеек. Следующий код использует reuseIdentifier как @"identifier"

if (cell == nil) { 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"identifier"]; 
} 

изменить его на:

if (cell == nil) { 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:identifier]; 
} 

EDIT:

На повторное использование клеток Tableview, вам не нужно создавать и добавлять подвидов в ячейку каждый раз. Вместо этого просто создайте subview при создании ячейки, а затем, если ячейка повторно используется, просто получите subview с помощью тега и обновите свой контент из источника данных.

Вашего код может быть изменен, как показано ниже:

if (cell == nil) { 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:identifier]; 
    UIImageView *imgVw=[[UIImageView alloc]initWithFrame:CGRectMake(250, 10, 40, 30)]; 
    imgVw.tag = indexPath.row; 
    [cell.contentView addSubview:imgVw]; 
} 
UIImageView imgVw = (UIImageView*)[cell.contentView viewWithTag:indexPath.row]; 
//Rest is same as you posted. 

Надеется, что это будет исправить эту проблему.

+0

об изменении этих данных перекрывается в ячейках – user2552751

+0

@ user2552751: обновлено мое ответ. – HRM

+0

в одной строке изображения меняют оставшиеся строки пустым без изображений – user2552751

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