使用UITableView滚动很慢

时间:2013-03-19 14:11:54

标签: objective-c uitableview uiimageview

我有一个UITableView动态显示获取的RSS,我现在已经自定义RSS以返回图像名称,以便我以后可以将UIImageView添加到表格中的每个单元格,在每个单元格旁边显示图像,这里是添加图像的代码

UIImageView *imageView = [[UIImageView alloc] init];
imageView.frame = CGRectMake(0, 0, 40, 40);

NSString *path = [NSString stringWithFormat:@"URL/%@",object.imageName]; //"object" is the returned Object from the RSS, so basically what i am doing is appending the image name to the path url.
NSURL *url = [NSURL URLWithString:path];
NSData *data = [NSData dataWithContentsOfURL:url];
imageView.image = [UIImage imageWithData:data];

[cell addSubview:imageView];
[cell bringSubviewToFront:imageView];

因此,当我运行我的应用程序时,应用程序运行缓慢,甚至停止了一小段时间,原因是我正在加载所有直接在此行中成像的RSS NSData *data = [NSData dataWithContentsOfURL:url];

解决这个问题的任何方法?

提前谢谢


我实际上想过在一个单独的线程中获取图像,

dispatch_queue_t fetchImage = dispatch_queue_create("Fetching Image", NULL);
dispatch_async(fetchImage, ^{
    NSData *data = [NSData dataWithContentsOfURL:url];
});
dispatch_release(fetchImage);

但这样做不允许我在队列外使用变量“data”。 任何想法?

3 个答案:

答案 0 :(得分:3)

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSString *path = [NSString stringWithFormat:@"URL/%@",object.imageName]; 
        NSURL *url = [NSURL URLWithString:path];
        NSData *data = [NSData dataWithContentsOfURL:url];
        dispatch_async(dispatch_get_main_queue(), ^{
            imageView.image = [UIImage imageWithData:data];
        }); });

答案 1 :(得分:0)

您应该异步检索数据!可能是使用开源库会对你有所帮助:

或者您也可以将NSURLConnection类与异步模式一起使用。

答案 2 :(得分:0)

方法[NSData dataWithContentsOfURL:]是同步的:每当你调用它时,只要完成它就会阻塞当前线程(几乎可以肯定是你应用程序的主线程)。这非常糟糕。除了让用户界觉感到笨拙之外,还有一个看门狗进程可以杀死无响应的应用程序。

你真的,真的想使用异步网络调用。阅读NSURLConnection,但也知道,在这个确切的主题上有很多文章和库以及样本:异步加载图像以便在表格视图中显示。可能是UIImageView上的AFNetworking类别,或者像SDWebImage这样的库。