代码示例: https://github.com/johnlui/Swift-On-iOS/blob/master/BuildYourHTTPRequestLibrary
开源项目:Pitaya,适合大文件上传的 HTTP 请求库: https://github.com/johnlui/Pitaya
本系列文章中,我们将尝试使用 NSURLSession 技术构建一个自己的网络请求库。
NSURLSession 是 iOS7 引入的新网络请求接口,在 WWDC2013 中有详细介绍,下面是描述其结构的一页 slides:
当应用在前台时,NSURLSession 跟 NSURLConnection 没有什么区别,但是在程序切换到后台之后 Background Session 就会更加灵活。
新建一个名为 BuildYourHTTPRequestLibrary 的单页面应用,在页面上居中放置一个按钮,名为 Request:
拖动绑定 Touch Up Inside 事件:
在 mainButtonBeTapped 函数内填充以下代码:
@IBAction func mainButtonBeTapped(sender: AnyObject) { let session = NSURLSession.sharedSession() let request = NSURLRequest(URL: NSURL(string: "http://baidu.com")!) let task = session.dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in let string = NSString(data: data, encoding: NSUTF8StringEncoding) println(string) }) task.resume() }
运行项目,点击按钮,查看结果:
改写 mainButtonBeTapped 函数的代码:
@IBAction func mainButtonBeTapped(sender: AnyObject) { let session = NSURLSession.sharedSession() let request = NSURLRequest(URL: NSURL(string: "http://baidu.com")!) let task = session.dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in println("just wait for 5 seconds!") sleep(5) let string = NSString(data: data, encoding: NSUTF8StringEncoding) println(string) }) task.resume() }
再次尝试,两次打印之间间隔了五秒,主线程未阻塞,证明 NSURLSession 为异步执行。
尝试多次点击,我们能够看到每五秒执行一次,直到全部执行完毕。
NSURLSession 采用的是 “异步阻塞” 模型,即所有请求在发出后都进入 2# 线程执行,在 2# 线程内部按照阻塞队列模式执行。
下一步:自己动手写一个 iOS 网络请求库(二)——封装接口【待更新】