将图像从 url 动态下载到 UIImageVIew

Posted

技术标签:

【中文标题】将图像从 url 动态下载到 UIImageVIew【英文标题】:Downloading image from a url into a UIImageVIew dynamically 【发布时间】:2013-11-15 09:12:33 【问题描述】:

我正在尝试从 url 插入和图像到 UIImageView。我使用以下代码来执行此操作。 运行程序时卡在

NSURL *url = [NSURL URLWithString:urlstring];

在下面的代码中,它在该特定行上显示“线程 1:信号 SIGABRT”。 有人可以帮我看看我使用的格式是正确的还是我做错了什么??

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

static NSString *CellIdentifier = @"newoffer";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
if (cell==nil)

    cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

NSDictionary *temp = [product objectAtIndex:indexPath.row];
UILabel *Label = (UILabel *)[cell viewWithTag:201];
Label.text = [temp objectForKey:@"item_name"];
UIImageView *Image = (UIImageView *)[cell viewWithTag:200];
NSString *urlstring=[temp objectForKey:@"image_url"];
NSURL *url = [NSURL URLWithString:urlstring];
NSData *data = [NSData dataWithContentsOfURL:url];
Image.image = [UIImage imageWithData:data];

return cell;


【问题讨论】:

如果可能,请在此处发布您的网址 如果我的回答对您有帮助,请在此处发布任何问题。 【参考方案1】:

更改此代码:

NSURL *url = [NSURL URLWithString:urlstring];
NSData *data = [NSData dataWithContentsOfURL:url];
Image.image = [UIImage imageWithData:data];

收件人:

 dispatch_queue_t myqueue = dispatch_queue_create("myqueue", NULL);

    // execute a task on that queue asynchronously
    dispatch_async(myqueue, ^
NSURL *url = [NSURL URLWithString:[urlstring stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];;
NSData *data = [NSData dataWithContentsOfURL:url];
 dispatch_async(dispatch_get_main_queue(), ^
Image.image = [UIImage imageWithData:data]; //UI updates should be done on the main thread
     );
    );

正如其他人所提到的,像 SDWebImage 这样的图像缓存库将有很大帮助,因为即使使用此实现,您只需将下载过程推送到后台线程,这样 UI 就不会卡住,但您不会缓存任何内容。

【讨论】:

【参考方案2】:

试试这个

[image setImage:[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.vbarter.com/images/content/1/9/19517.jpg"]]]];

用于异步下载

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^

[image setImage:[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.vbarter.com/images/content/1/9/19517.jpg"]]]];

);

如果 url 是动态的,那么

NSString *stringUrl; // this can be any valid url as string

[image setImage:[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:stringUrl]]]];

【讨论】:

@Anand 当我使用上面的代码时,它可以工作。但是 URL 是动态的,并且会发生变化。因此,当我将图像放入 NSString 对象时,就会出现上述问题。【参考方案3】:

NSData *data = [NSData dataWithContentsOfURL:url];

将同步加载imageData,这意味着主线程将被阻塞。

使用github上的项目:SDWebImage进行图片异步加载和缓存。

【讨论】:

【参考方案4】:

现在可能有更好的库可以做到这一点,但我一直在我的项目中使用它并且效果很好:AsyncImageView。还有其他选择,例如SDWebImage

但基本上,你不想使用

NSData *data = [NSData dataWithContentsOfURL:url];

因为它会阻塞主线程,直到图像被下载。为避免这种情况,您可能需要使用异步的东西,例如上述两个库。

例如,使用AsyncImageView,它变得如此简单:

myImageView.imageURL = someNSURL;

【讨论】:

以上是关于将图像从 url 动态下载到 UIImageVIew的主要内容,如果未能解决你的问题,请参考以下文章

从内存中的 url 下载图像并在内存中创建 zip 存档以发送到浏览器

从 URL 下载到本地存储的快速图像

从 JSON url 下载图像不起作用。 [关闭]

从字符串 URL 数组下载图像并保存到文件?

如何使用 angularjs 从 url 下载(保存)图像到我们的相册中?

Android - 在显示进度时将图像从 URL 加载到 ImageView(不保存图像)