在iOS中使用URL创建UIImage

47
使用以下代码创建一个带有图片文件的UIImage:

UIImage *image = [UIImage imageNamed:@"imageName.png"];

UIImage *aImage = [[UIImage imageNamed:@"demo.jpg"]autorelease];
如果我想用URL http://example.com/demo.jpg 创建一个UiImage,应该怎么做呢?
谢谢。
更新: enter image description here

1
你可能想看一下这个项目:https://github.com/rs/SDWebImage - user160917
3个回答

153

这是一个三步过程。首先,您将创建一个NSURL对象来保存我们尝试访问的URL。我们将提供此URL给NSData类方法+dataWithContentsOfURL:,以获取网络上的图像原始数据,然后使用UIImage上的+imageWithData:类方法将数据转换为图像。

NSURL *imageURL = [NSURL URLWithString:@"http://example.com/demo.jpg"];
NSData *imageData = [NSData dataWithContentsOfURL:imageURL];
UIImage *image = [UIImage imageWithData:imageData];
请注意,+dataWithContentsOfURL: 执行一个同步的网络请求。如果你在主线程上运行它,它会阻塞UI直到从网络接收到图像数据。最佳实践是在后台线程上运行任何网络代码。如果你的目标是OS 4.0+,你可以尝试以下方法...
NSURL *imageURL = [NSURL URLWithString:@"http://example.com/demo.jpg"];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
    NSData *imageData = [NSData dataWithContentsOfURL:imageURL];

    dispatch_async(dispatch_get_main_queue(), ^{
        // Update the UI
        self.imageView.image = [UIImage imageWithData:imageData];
    });
});

2
谢谢你的建议,但是当我把代码放在一个类中时,出现了错误信息,请看我的更新。 - Charles Yeung
修正了一个打字错误。在第一个dispatch_async()调用中有一个多余的闭合括号。 - Mark Adams
@MarkAdams 我不知道为什么,但是对我来说这个功能工作不一致。有时候会出现NSCocoaErrorDomain 256的错误而imageData是空的。 - Cameron Askew

7
这里是同样的代码在Swift中的写法:
let image_url = NSURL("http://i.imgur.com/3yY2qdu.jpg")

let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
dispatch_async(dispatch_get_global_queue(priority, 0)) {
    // do some task
    let image_data = NSData(contentsOfURL: image_url!)

    dispatch_async(dispatch_get_main_queue()) {
        // update some UI
        let image = UIImage(data: image_data!)
        self.imageView.image = image
    }
}

在Xcode 9中,异步调度的首选Swift语法是DispatchQueue.global(qos: .default).async { //block } - atineoSE

0

对于任何想要从网络加载图像的人,以下库可能会有所帮助:

https://github.com/rs/SDWebImage

这是一个处理异步加载和从URL缓存图像的UIImageView类别。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接