Swift 通过URL加载图片

一、前言

现在项目中图片的请求一般都是用SDWebImage,但是在开发中经常需要我们前端先搭建UI,然后等后台接口写好之后再对接数据。那么在事先搭建UI的过程中往往会自己填充一些假数据。
但是通过URL获取UIImage的操作在OC和Swift中有一些差异,这篇文章只是用来区分和记录一下。

二、获取Data的思考

在OC中,通过URL加载图片是一件非常简单的事情,但是之前有看过一个内存泄漏的问题:大概就是在子线程中通过URL加载数据,但是这个下载任务在后台出错了,所以导致这个子线程一直被占用。

所以在Swift中,Data的请求多了一个异常处理:Data(contentsOf: <URL>) throws

在OC中获取UIImage:

NSURL *imgurl = [NSURL URLWithString:@"path"];
NSData *imagedata = [NSData dataWithContentsOfURL:imgurl];
UIImage *img = [[UIImage alloc] initWithData:imagedata];

在Swift中获取UIImage:

let url = URL(string: "path")
do {
    let data = try Data(contentsOf: url!)
    let image = UIImage(data: data)
}catch let error as NSError {
    print(error)
}
三、Swift中请求图片,StackOverFlow上的解决方案

使用URLSession异步请求,封装成UIImageView的扩展:

extension UIImageView {
    func downloadedFrom(url: URL, contentMode mode: UIViewContentMode = .scaleAspectFit) {
        contentMode = mode
        URLSession.shared.dataTask(with: url) { data, response, error in
            guard
                let httpURLResponse = response as? HTTPURLResponse, httpURLResponse.statusCode == 200,
                let mimeType = response?.mimeType, mimeType.hasPrefix("image"),
                let data = data, error == nil,
                let image = UIImage(data: data)
                else { return }
            DispatchQueue.main.async() {
                self.image = image
            }
            }.resume()
    }
    func downloadedFrom(link: String, contentMode mode: UIViewContentMode = .scaleAspectFit) {
        guard let url = URL(string: link) else { return }
        downloadedFrom(url: url, contentMode: mode)
    }
}

using:imageView.downloadedFrom(link: "path")

参考: Loading/Downloading image from URL on Swift

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AI阅读 16,037评论 3 119
  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,797评论 8 265
  • 今天是我们在一起的第105天,今晚真的很不开心,其实我最难受的就是那个男的来缠着她,为什么她还有让那个男的来缠着她...
    灰太狼_e56e阅读 3,064评论 0 0
  • 2017年自我总结:读书太少,想法太多。办法太少,感触太多。落实太少,计划太多。
    阿杜阿云阅读 3,146评论 0 3
  • 试试看好不好用
    箬儿阅读 968评论 0 0