Swift 通过URL加载图片
2018-06-29 本文已影响62人
YYYYYY25
一、前言
现在项目中图片的请求一般都是用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)
}
}
调用:imageView.downloadedFrom(link: "path")