正在使用以下代码设置tablview单元格...
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
MyTableviewcell *cell = [tableView dequeueReusableCellWithIdentifier:@"mytableviewcell" forIndexPath:indexPath];
cell.titleLabel.text = [self.data[indexPath.row] objectForKey:@"node_title"];
cell.taxonomy1Label.text = [self.data[indexPath.row] objectForKey:@"group"];
@try {
NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:[self.data[indexPath.row] objectForKey:@"image"]]];
cell.thumbnailImageView.image = [UIImage imageWithData:imageData];
}
@catch (NSException * e) {
NSLog(@"Exception: %@", e);
}
return cell;
}
try/catch
只是因为它可能会或者可能没有图像,但它甚至在我把它放入之前就已经发生了。似乎在它将单元格出列时存在某种问题。有什么想法吗?
答案 0 :(得分:0)
如果您熟悉使用第三方库或CocoaPods,但这是一个常见问题,我建议使用https://github.com/rs/SDWebImage或https://github.com/AFNetworking/AFNetworking,它们具有UIImageView类别方法来处理从中加载图像背景中的URL,而不是主线程中的URL。
例如使用SDWebImage:
[cell.thumbnailImageView sd_setImageWithURL:yourImageURL];
此方法将在后台获取图像,而不是阻塞主线程,并且不会使您的UITableView抖动。
答案 1 :(得分:0)
如前所述,此调用会阻止主线程:
NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:[self.data[indexPath.row] objectForKey:@"image"]]];
尚未提及的是处理此类工作的正确方法。
你不能只在GCD电话中包含上述内容,并希望一切顺利。
您需要延迟加载图像并在适当的时候在tableView上填充它们。
处理此问题的最优雅方法是编写自己的 NSOperation
。
Here是一个教程,任何进一步的问题都让我知道。
答案 2 :(得分:-1)
您正在通过尝试获取图像来阻碍主线程。将您的图像调用放在一个单独的线程中。