【问题标题】:Create a UIImage with a URL in iOS在 iOS 中创建带有 URL 的 UIImage
【发布时间】:2011-12-03 09:35:04
【问题描述】:

要创建带有图像文件的 UiImage,我使用如下代码:

UIImage *aImage = [[UIImage imageNamed:@"demo.jpg"]autorelease];

如果我想创建一个 URL 为 http://example.com/demo.jpg 的 UiImage,该怎么做?

谢谢

更新

【问题讨论】:

标签: objective-c ios uikit uiimage


【解决方案1】:

这是一个三步过程。首先,您将创建一个 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];
    });
});

【讨论】:

  • 感谢您的建议,但我在将代码放入课程时收到错误消息,请参阅我的更新
  • 修正了错字。在第一个 dispatch_async() 调用中有一个额外的右括号。
  • 非常感谢您的出色回答。 :-)
  • @MarkAdams 我不知道为什么,但这对我来说并不一致。有时 imageData 是 nil 与 NSCocoaErrorDomain 256
【解决方案2】:

下面是相同的代码在 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 }
【解决方案3】:

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

https://github.com/rs/SDWebImage

这是一个 UIImageView 类别,用于处理来自 url 的异步加载和图像缓存。

【讨论】:

    猜你喜欢
    • 2011-12-04
    • 2016-02-27
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    相关资源
    最近更新 更多