如何修复慢速滚动表视图

时间:2012-11-23 17:03:25

标签: objective-c ios uitableview tableview

我有一个慢慢滚动的表格视图。有谁知道为什么会这样?

每行都有一个图像,但即使在加载图像后,它仍然会慢慢地卡住和滚动。

感谢您的帮助

这是我的代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *simpleTableIdentifier = @"SimpleTableCell";

    SimpleTableCell *cell = (SimpleTableCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
    if (cell == nil)
    {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"SimpleTableCell" owner:self options:nil];
        cell = [nib objectAtIndex:0];
    }
    // Get item from tableData
    NSDictionary *item = (NSDictionary *)[displayItems objectAtIndex:indexPath.row];

    // display the youdeal deal image
    photoString = [item objectForKey:@"image"];
    UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:photoString]]];

    cell.titleLabel.text = [item objectForKey:@"supercat"];
    cell.descriptionLabel.text = [item objectForKey:@"title"];

    NSString *convertedLeftCount = [NSString stringWithFormat:@"%@",[item objectForKey:@"left_count"]];

    cell.amountLabel.text = convertedLeftCount;

    cell.thumbnailImageView.image = image;
    cell.priceLabel.text = [item objectForKey:@"cat"];

    return cell;
}

3 个答案:

答案 0 :(得分:3)

这是由于您使用的图像加载机制。

您正在主线程中从url加载图像。这就是为什么UI被阻塞一段时间dataWithContentsOfURL:同步调用。因此,UI将在获取图像数据后作出响应。

Apple指出,接受webrequest,解析大量数据等流程的时间必须在其他线程而不是主线程上完成。 并且所有与UI相关的任务必须在主线程上完成。

<强>解决方案:

  1. 在后台线程中请求图像,而不是在主线程中。
  2. 获得图像后缓存图像
  3. 源代码和第三方库

    以下是一些链接,可帮助您了解使用异步方法借出图像的基本思路

    1. LazyTableImages
    2. HJCache
    3. SDWebImage

答案 1 :(得分:2)

每次加载单元格时都会加载图像,因为imageWithData:不使用任何缓存。

编辑:我看到一条评论建议异步加载图片。您已经拥有每个单元格的自定义类,因此应该很容易实现。如果这是一个答案我会投票

答案 2 :(得分:0)

我想你是想说这个。

NSURL* url = [NSURL URLWithString:@"http://www.YourImageUrl.com"];
NSURLRequest* request = [NSURLRequest requestWithURL:url];


[NSURLConnection sendAsynchronousRequest:request
    queue:[NSOperationQueue mainQueue]
    completionHandler:^(NSURLResponse * response,
        NSData * data,
        NSError * error) {
if (!error){
        UIImage* image = [[UIImage alloc] initWithData:data];
    // Now workout with the image
}

}];

这将进行异步调用,并在加载tableview后加载图像,即当图像加载完成时图像将显示但是当需要加载表视图时将加载表。