0

我有一个 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];

所以当我运行我的应用程序时,应用程序运行缓慢,甚至停止一小段时间,原因是我正在加载直接在这一行中成像的所有 RSSNSData *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);

但这样做不会让我在队列外使用变量“数据”。任何的想法 ?

4

3 回答 3

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];
        }); });
于 2013-03-19T14:28:16.370 回答
0

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

或者您也可以使用NSURLConnection具有异步模式的类。

于 2013-03-19T14:22:57.880 回答
0

该方法[NSData dataWithContentsOfURL:]是同步的:无论何时调用它,它都会阻塞当前线程(几乎可以肯定是您的应用程序的主线程),直到它完成为止。这很糟糕。除了让 UI 感觉卡顿之外,还有一个看门狗进程会杀死无响应的应用程序。

您真的非常想使用异步网络调用。继续阅读NSURLConnection,但也知道有很多关于这个主题的文章、库和示例:异步加载图像以在表格视图中显示。从 AFNetworking 上的类别开始UIImageView,或者像 SDWebImage 这样的库。

于 2013-03-19T14:23:35.313 回答