滚动表格视图时如何避免减速?

时间:2011-07-15 13:26:05

标签: iphone objective-c uitableview

我有自定义表格视图单元格,包含图像(从应用程序文档目录加载),标签,阴影等。当我滚动表格视图时,会导致很多滞后。我怎样才能避免这些滞后?我认为可以缓存表格视图单元格,或者获取表格视图单元格的图片,但我不知道如何实现它。请帮帮我:)

在cellForRowAtIndexPath中:我在if (cell == nil)块中设置数据,但仍然存在减速。

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        // ...configuring is here...
    }

    return cell;
}

P.S。单元格中的图像是高分辨率,但缩小到适合...

3 个答案:

答案 0 :(得分:8)

您应该在后台线程中加载图像。如果您使用的是iOS 4+,则可以使用GCD(Grand Central Dispatch)异步加载这些内容。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    static NSString *CellIdentifier = @"ImageCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                       reuseIdentifier:CellIdentifier] autorelease];
    }
    NSString *imagepath = //get path to image here
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
    dispatch_async(queue, ^{
        UIImage *image = [UIImage imageWithContentsOfFile:imagePath];
        dispatch_sync(dispatch_get_main_queue(), ^{
            [[cell imageView] setImage:image];
            [cell setNeedsLayout];
        });
    });
    return cell;
}

答案 1 :(得分:3)

检查一下:http://www.markj.net/iphone-asynchronous-table-image/

这可能会有所帮助。

答案 2 :(得分:2)

我认为你正在加载来自URL的图像,这就是你在滚动时遇到滞后的原因..你应该使用Lazy表图像看看这个 - http://developer.apple.com/iphone/library/samplecode/LazyTableImages/index.html

查看上面的示例代码并发布您的exp。在评论中

更新1 - 尝试逐个从单元格中删除元素..并检查导致此内容的元素..

更新2 - 确定..然后你知道图片导致问题..所以你需要使用线程加载它们或者你也可以使用懒惰的表图像概念..似乎图像大小相当高。