我能够异步地获取图像到uitableview.i我正在获取这些图像来自url.on向上滚动uitableview这些图像消失,他们需要时间再次加载,有时他们根本不加载。我不想使用任何第三方库。我不想采用同步方法。请建议任何正确的方法来提高性能。谢谢提前帮助。我的代码如下:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *identifier=@"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];
strImgUrl=@"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 :(得分:2)
UITableViews旨在重用单元格。例如,当您向上滚动时,第一个单元格可能会被重复使用以显示第5个单元格,因为第一个单元格现在不在屏幕上。当您向后滚动时,再次调用cellForRowAtIndexPath,并且您再次同步下载相同的图像。如果你想立即加载它,你需要在第一次下载图像后缓存它们,这样下次需要图像时你可以直接从缓存中拉出它。
许多第三方库都这样做(AFNetworking),但如果您不想使用它们,则必须手动缓存图像。
答案 1 :(得分:0)
您的重用代码似乎包含bug,这会导致每次都创建新的单元格。以下代码使用reuseIdentifier作为@"identifier"
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"identifier"];
}
将其更改为:
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:identifier];
}
编辑:
重新使用tableView单元格时,您不需要每次都为单元格创建和添加子视图。相反,只需在创建单元格时创建子视图,然后如果单元格正在重复使用,只需使用标记获取子视图并从数据源更新内容。
您的代码可以修改如下:
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.
希望这能解决问题。