ios自带功能篇

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")

参考: Loading/Downloading image from URL on Swift

上一篇下一篇

猜你喜欢

热点阅读