iOS加载本地图片很简单,只须要将图片当作资源加入到工程,imageView.image = UIImage(named: "这里加入导入的资源名字")就能够了,然而对于看图app,不可能将海量的图片都加入到app当中,而是经过网络获取图片,而后再用来显示,这样作就能实时从网络上获取最新的图片。废话很少说,如今讲讲再swfit3.0中用到的几种加载网络图片的方法。swift
// storyboard拉一个imageView,关联输出口 @IBOutlet weak var loadImageFromURL: UIImageView!
// 方法一: 同步加载网络图片 let url = URL(string: "http://i.imgur.com/w5rkSIj.jpg") // 从url上获取内容 // 获取内容结束才进行下一步 let data = try? Data(contentsOf: url!) if let imageData = data { let image = UIImage(data: data!) loadImageFromURL.image = image }
// 方法二: 异步加载网络图片 let urlString = "http://i.imgur.com/w5rkSIj.jpg" let catPictureURL = URL(string: urlString)! // url带中文的,urlString必须通过处理,加addingPercentEncoding,否则catPictureURL为nil,不带中文就不须要 // 这个是url带中文的处理方法 // let urlString = "http://localhost:8080/AlbumImage/杀破狼.jpg" // let unsafeP = urlString.addingPercentEncoding(withAllowedCharacters: NSCharacterSet(charactersIn:"`#%^{}\"[]|\\<> ").inverted)! // let catPictureURL = URL(string: unsafeP)! // 用默认配置建立一个session对象 let session = URLSession(configuration: .default) // 定义一个下载task,下载task会把url的内容读到data中,而后你能够用data来操做,如加载图片,缓存图片等 let downloadPicTask = session.dataTask(with: catPictureURL) { (data, response, error) in // The download has finished. if let e = error { print("Error downloading cat picture: \(e)") } else { // No errors found. // It would be weird if we didn't have a response, so check for that too. if let res = response as? HTTPURLResponse { print("Downloaded cat picture with response code \(res.statusCode)") if let imageData = data { // Finally convert that Data into an image and do what you wish with it. let image = UIImage(data: imageData) // Do something with your image. DispatchQueue.main.async { self.loadImageFromURL.image = image } } else { print("Couldn't get image: Image is nil") } } else { print("Couldn't get response code for some reason") } } } // 这一句必需要加,否则task不会开始 downloadPicTask.resume()
方法三:异步加载网络图片
//方法三: 异步加载网络图片 //建立URL对象 let url = URL(string:"http://i.imgur.com/w5rkSIj.jpg")! //建立请求对象 let request = URLRequest(url: url) let session = URLSession.shared let dataTask = session.dataTask(with: request, completionHandler: { (data, response, error) -> Void in if error != nil{ print(error.debugDescription) }else{ //将图片数据赋予UIImage let img = UIImage(data:data!) // 这里须要改UI,须要回到主线程 // DispatchQueue.main.async { self.loadImageFromURL.image = img // } } }) as URLSessionTask //使用resume方法启动任务 dataTask.resume()
extension UIImageView { func downloadedFrom(url: URL, contentMode mode: UIViewContentMode = .scaleToFill) { contentMode = mode URLSession.shared.dataTask(with: url) { (data, response, error) in // The download has finished. if let e = error { print("Error downloading cat picture: \(e)") } else { // No errors found. // It would be weird if we didn't have a response, so check for that too. if let res = response as? HTTPURLResponse { print("Downloaded cat picture with response code \(res.statusCode)") if let imageData = data { // Finally convert that Data into an image and do what you wish with it. let image = UIImage(data: imageData) // Do something with your image. DispatchQueue.main.async() { () -> Void in self.image = image } } else { print("Couldn't get image: Image is nil") } } else { print("Couldn't get response code for some reason") } } }.resume() } func downloadedFrom(link: String, contentMode mode: UIViewContentMode = .scaleAspectFit) { guard let url = URL(string: link) else { return } downloadedFrom(url: url, contentMode: mode) } }
let urlString = "http://i.imgur.com/w5rkSIj.jpg" if let url = URL(string: urlString) { loadImageFromURL.downloadedFrom(url: url) }