NSOperation执行uitableview单元格图像

时间:2011-06-02 14:03:54

标签: ipad uitableview uiimageview nsoperationqueue


由于我是iPad应用程序开发的新手,请帮我解决一个简单的问题 我想从服务器在tableview中显示图像。它显示正确。
但是当我向上滚动表并再次回到那里时,它将再次从服务器下载图像数据 请帮帮我。

编辑:
tableView:cellForRowAtIndexPath:

static NSString *CellIdentifier = @"cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
[cell setSelectionStyle:UITableViewCellSelectionStyleBlue];
UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 1024, 75)];
[imgView setImage:[UIImage imageNamed:@"strip_normal.png"]];
[imgView setHighlightedImage:[UIImage imageNamed:@"strip_hover.png"]];
[cell addSubview:imgView];
[imgView release];

UIImageView *imgView1 = [[UIImageView alloc] initWithFrame:CGRectMake(5, 5, 64, 64)];
imgView1.tag = indexPath.row;
UIImage *img = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://www.abc.com/abc/%@.png", [[arrMyCourses objectAtIndex:indexPath.row] valueForKey:@"CourseNumber"]]]]];
[imgView1 setImage:img];
[cell addSubview:imgView1];
[imgView1 release];

return cell;

提前致谢。

1 个答案:

答案 0 :(得分:1)

你的问题就在这一行

UIImage *img = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://www.abc.com/abc/%@.png", [[arrMyCourses objectAtIndex:indexPath.row] valueForKey:@"CourseNumber"]]]]];

每次表格视图请求单元格时,您都在下载图像,并且相信我这种情况经常发生,因为表格视图不能一次构建整个视图。它重复使用离开屏幕的细胞来呈现新的可见细胞。因此,只要一个单元格离开屏幕并重新开启,就会再次调用cellForRowAtIndexPath:。所以图像再次下载。您也在同步下载图像,这也将阻止UI。

要解决此问题,您应该考虑在开始时将它们下载一次,并将它们本地保存在临时位置,并根据需要将它们加载到内存中。将所有这些都放在内存中可能会很昂贵。此外,使用performSelectorInBackground:withObject将您的下载移至后台。您必须将UIKit更新发送回主线程,否则您将遇到崩溃。