本文将演示如何通过异步请求的方式,下载网络图片。
异步请求与同步请求相比,不会阻塞程序的主线程,而会建立一个新的线程。
在项目导航区,打开视图控制器的代码文件【ViewController.swift】
1 import UIKit 2 3 class ViewController: UIViewController { 4 5 //给当前视图控制器类,添加一个图像视图属性。 6 //该图像视图对象,将用来显示下载的网络图片 7 var imageView = UIImageView() 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 // Do any additional setup after loading the view, typically from a nib. 12 13 //设置图像视图对象的位置在(40,80),尺寸为(240,80) 14 self.imageView.frame = CGRect(x: 40, y: 80, 240, height: 280) 15 //将设置好的图像视图对象,添加到当前视图控制器的根视图 16 self.view.addSubview(imageView) 17 18 //创建一个网址对象,指定请求网络图片的地址 19 let url = URL(string: "http://images.apple.com/v/imac/e/images/overview/imac_27_hero_large_2x.jpg") 20 //创建一个网络请求对象 21 let request = URLRequest(url: url!) 22 23 //利用网络连接对象NSURLConnectiony,实现网络的通信 24 //网络连接对象NSURLConnectiony已经不被推荐使用,请使用NSURLSession网络会话类 25 NSURLConnection.sendAsynchronousRequest(request, 26 queue: OperationQueue.main, 27 completionHandler: {(response:URLResponse?, 28 data:Data?,error:Error?)->Void in 29 //在控制台输出当前的线程是否位于主线程 30 print(Thread.isMainThread) 31 //添加一个闭包语句,返回应用的主线程 32 DispatchQueue.main.async(execute: { () -> Void in 33 //将网络返回的数据对象,转换为图像格式, 34 let image = UIImage(data: data!) 35 //然后在主线程里更新图像视图的显示内容 36 self.imageView.image = image 37 }) 38 }) 39 } 40 41 override func didReceiveMemoryWarning() { 42 super.didReceiveMemoryWarning() 43 // Dispose of any resources that can be recreated. 44 } 45 }