IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

自己动手写一个 iOS 网络请求库(一)—— NSURLSession 初探

岁寒 2016-04-02 23:22:02 累计浏览 3,272 次
本机暂存

本系列文章中,我们将尝试使用 NSURLSession 技术构建一个自己的网络请求库。

NSURLSession 简介

NSURLSession 是 iOS7 引入的新网络请求接口,在 WWDC2013 中有详细介绍,下面是描述其结构的一页 slides:

Image

当应用在前台时,NSURLSession 跟 NSURLConnection 没有什么区别,但是在程序切换到后台之后 Background Session 就会更加灵活。

尝试 NSURLSession

准备工作

新建一个名为 BuildYourHTTPRequestLibrary 的单页面应用,在页面上居中放置一个按钮,名为 Request:

Image

拖动绑定 Touch Up Inside 事件:

Image

Image

使用 NSURLSession

在 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()
}

运行项目,点击按钮,查看结果:

Image

使用成功!

感受异步

异步

改写 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# 线程内部按照阻塞队列模式执行。初步判断,此阻塞特性为 NSURLSession.sharedSession() 单例模式的结果。

代码示例:https://github.com/johnlui/Swift-On-iOS/blob/master/BuildYourHTTPRequestLibrary

开源项目:Pitaya,适合大文件上传的 HTTP 请求库:https://github.com/johnlui/Pitaya

同分类推荐文章

  1. 「置顶」我做了什么 (2026-05-05 12:13:28)
  2. 万字长文推演:手机不再从 App 开始,Agent OS 如何接管任务入口 (2026-04-28 14:57:22)
  3. Android Perfetto 系列 10 - Binder 调度与锁竞争 (2025-11-16 15:33:30)

查看更多 移动开发 文章 →

建议继续学习

  1. App的成本 (累计阅读 7,584)
  2. iPhone下的libcurl with SSL for iOS (累计阅读 6,350)
  3. iOS的定位原理揭秘 (累计阅读 5,946)
  4. iOS内存暴增问题追查与使用陷阱 (累计阅读 5,840)
  5. libcurl中使用curl_easy_getinfo 产生段错误分析 (累计阅读 5,783)
  6. IOS APP设计流程 (累计阅读 5,085)
  7. 在Visual Studio中使用MonoTouch开发iOS应用程序(上):环境配置 (累计阅读 5,077)
  8. iOS push服务 (累计阅读 4,943)
  9. 有关思维,有关Ipad一个Bug的故事 (累计阅读 4,770)
  10. MYSQL数据库网卡软中断不平衡问题及解决方案 (累计阅读 4,766)