为什么我的tableview很慢?

时间:2014-02-05 02:19:34

标签: ios objective-c uitableview

我正在使用一些NSArrays加载一个tableview,该单元格包含两个标签和一个加载了URL图像的背景图像视图。问题是tableview的滚动速度很慢,就像冻结一样....我认为这是因为Imageview但我该怎么做???

继承了我的一些代码,你可以看到:

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{

    // Return the number of rows in the section.


    return _Title.count;


}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    MyCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    int row = [indexPath row];

    cell.TitleLabel.text = _Title[row];
    cell.DescriptionLabel.text = _content[row];
    cell.CellImageView.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:_ImageUrl[row]]]];
    cell.CellImageView.contentMode = UIViewContentModeTop;
    cell.CellImageView.contentMode = UIContentSizeCategoryMedium;

    cell.backgroundColor = [UIColor clearColor];





    return cell;
}

有关额外信息,此tableview会显示一个具有相同信息的Detailviewcontroller。

5 个答案:

答案 0 :(得分:5)

异步加载图像(在图像进入时加载图像)。查看优秀的课程,例如SDWebImage https://github.com/rs/SDWebImage

答案 1 :(得分:1)

您使用以下代码行阻止主线程:

cell.CellImageView.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:_ImageUrl[row]]]];

我的建议是使用AFNetworking并将代码替换为以下内容:

[cell.cellImageView setImageWithURL:[NSURL URLWithString:@"http://example.com/image.png"]];

此外,您的指针应以小写字母开头。例如,CellImageView应该是cellImageView。

答案 2 :(得分:1)

要扩展@vborra的答案 - 你的tableview缓慢的原因是(在你的代码中)整个图像必须在显示之前完成下载。

这是因为dataWithContentsOfURL:是一种同步方法。您需要使用异步API在后台下载图像,并在完成下载后将其显示在屏幕上。

以下是适用于您的示例的github页面的代码段。确保将文件夹SDWebImage及其内容从https://github.com/rs/SDWebImage添加到您的项目中。

#import <SDWebImage/UIImageView+WebCache.h>

...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{ 
    static NSString *CellIdentifier = @"Cell";
    MyCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    int row = [indexPath row];

    cell.TitleLabel.text = _Title[row];
    cell.DescriptionLabel.text = _content[row];
    [cell.CellImageView setImageWithURL:[NSURL URLWithString:_ImageUrl[row]]
                   placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
    cell.CellImageView.contentMode = UIViewContentModeTop;
    cell.CellImageView.contentMode = UIContentSizeCategoryMedium;

    cell.backgroundColor = [UIColor clearColor];
    return cell;
}

注意,如果您要下载所有不同尺寸的图像,最终可能会调整问题大小,这也会降低您的性能。 SDWebImage页面有一个指向文章的链接,以便在遇到此问题时帮助您解决此问题。 http://www.wrichards.com/blog/2011/11/sdwebimage-fixed-width-cell-images/

使用透明度和表格视图时,您可能还会遇到性能提升,但这取决于代码的其余部分。

AFNetworking是一款非常出色的工具,但如果您在应用中的其他任何地方都没有使用网络网络,那么它可能会过度使用。

答案 3 :(得分:1)

您从[NSData dataWithContentsOfURL:[NSURL URLWithString:_ImageUrl[row]]]致电cellForRowAtIndexPath,这不是个好主意。因为每次加载UITableViewCell时它都会进入服务器。

您必须使用异步图片加载&amp;缓存。这些库可能对您有所帮助:(我个人最喜欢的是SDWebImage

1)https://github.com/rs/SDWebImage

2)https://github.com/nicklockwood/AsyncImageView

此外,您可以参考示例代码 Apple 关于LazyTableImages - https://developer.apple.com/library/ios/samplecode/LazyTableImages/Introduction/Intro.html

<强>更新

对于SDWebImage,请按照本指南操作。这非常好。

http://iosmadesimple.blogspot.in/2013/04/lazy-image-loading.html

答案 4 :(得分:-2)

像这样加载您的图片

//get a dispatch queue
dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//this will start the image loading in bg
dispatch_async(concurrentQueue, ^{
    NSData *imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:mapUrlStr]];
    //this will set the image when loading is finished
    dispatch_async(dispatch_get_main_queue(), ^{
        cell.CellImageView.image = [UIImage imageWithData:imageData]

    });
});