iOS加载本地图片很简单,只需要将图片当做资源加入到工程,imageView.image = UIImage(named: "这里加入导入的资源名字")就可以了,然而对于看图app,不可能将海量的图片都加入到app当中,而是通过网络获取图片,然后再用来显示,这样做就能实时从网络上获取最新的图片。废话不多说,现在讲讲再swfit3.0中用到的几种加载网络图片的方法。
// 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()
图1
最后将加载网络图片做个简单封装,扩展UIImageView:
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)
}