我正在将图像加载到我的UITableViewCell中,它变得不稳定。我最多只有5-10个细胞。
有没有简单的方法可以解决这个问题?
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"appointmentCell";
AppointmentTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
NSDictionary *appointmentDictionaryTemp = [self.appointmentArray objectAtIndex:indexPath.row];
cell.patientNameLabel.text = [appointmentDictionaryTemp objectForKey:@"patient"];
cell.appointmentTimeLabel.text = [appointmentDictionaryTemp objectForKey:@"scheduled_time"];
NSString *urlString = [[appointmentDictionaryTemp objectForKey:@"patient_small_photo_url"] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSData * imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]];
UIImage * image = [UIImage imageWithData:imageData];
cell.patientImage.image = image;
return cell;
}
答案 0 :(得分:2)
dataWithContentsOfURL:
是你的罪魁祸首。它在应用程序的主UI线程上执行同步(阻塞)网络请求,导致表视图在下载图像时锁定。
解决方案涉及更多,它涉及使用NSURLConnection(或其他一些第三方库)异步下载数据,允许UI在下载图像时保持响应。 This是一个很好的资源,可供参考。
答案 1 :(得分:1)
创建一个名为imageCache
的ivar,它是NSArray
。现在在init
:
for (NSDictionary *appointmentDictionaryTemp in self.appointmentArray) {
NSString *urlString = [[appointmentDictionaryTemp objectForKey:@"patient_small_photo_url"] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSData * imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]];
UIImage * image = [UIImage imageWithData:imageData];
[imageCache addObject:image];
}
现在在cellForRowAtIndexPath
:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"appointmentCell";
AppointmentTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
NSDictionary *appointmentDictionaryTemp = [self.appointmentArray objectAtIndex:indexPath.row];
cell.patientNameLabel.text = [appointmentDictionaryTemp objectForKey:@"patient"];
cell.appointmentTimeLabel.text = [appointmentDictionaryTemp objectForKey:@"scheduled_time"];
cell.patientImage.image = [imageCache objectAtIndex:indexPath.row];
return cell;
}
答案 2 :(得分:0)
异步加载图像并可能缓存它们。首先阅读这个问题:Lazy load images in UITableViewCell
答案 3 :(得分:0)
使用索引路径作为密钥将图像存储在NSCache中,然后在您的 tableView:cellForRowAtIndexPath:方法,检查索引路径是否有对象。如果有将其加载到image属性中,如果没有,则调用方法生成它。这将在每次绘制单元格时停止它。
答案 4 :(得分:0)
有一个UIImageView图像的延迟/缓存网络的开源(MIT许可证)实现,你应该看一下:SDWebImage。以异步方式下载/缓存图像并自动更新UIImageViews。