资讯专栏INFORMATION COLUMN

iOS 网络基础

Edison / 1978人阅读

摘要:长期以来我们在处理中的网络通信的时候都是直接使用版或者版,但是我们竟然很少会去认真关注中的网络基础底层内容。这篇文章将介绍底层网络通信的基础内容。这将允许程序和网络基础框架之间相互独立,不会发生干扰。

长期以来我们在处理 iOS 中的网络通信的时候都是直接使用 OC 版 AFNetworking 或者 Swift 版 Alamofire ,但是我们竟然很少会去认真关注 iOS 中的网络基础底层内容。这同时折射出了 iOS 开发中的一个问题:iOS 开发有着丰富的组件、完善的生态、成熟的机制,这些特质让 iOS 开发的门槛低的几乎只要一台 MBP,但这也让开发人员思维退化慢慢的变成了一名搬砖工。这篇文章将介绍 iOS 底层网络通信的基础内容。

URLSession

从服务器获取数据、更新个人资料、下载或者上传文件,这些App中功能都是通过 HTTP 请求进行实现的。为了方便开发者对 HTTP 进行处理,Apple为 我们提供了 URLSession 组件。URLSession 是 iOS7 之后引入的底层网络通信架构,在此之前使用的是 NSURLConnection(iOS9 中已废弃)。其实 URLSession 除了指代同名类之外,更大程度上应该表达为整套的网络架构相关的类。URLSession 包含了 NSURLConnection 时代就有的 URLRequest 与 URLCache,但是它将 NSURLConnection 进行了分解。分解后的结构如下图:

URLSessionDelegate

URLSessionDelegate 只负责处理 Session 级别的事务,诸如服务器信任,客户端证书的评估。该 delegate 并不是必须的,如果开发者没有自己设置 delegate 系统会完成默认设置但是必须提供一个 completionHandler 来进行数据处理。

另一个需要注意的是:不同于我们常用的编程规范,session 对 delegate 保持这强引用而不是 weak。这表明此处的代码设计会涉及到内存泄漏的问题,所以我们要小心处理。处理办法是使用单例模式或者通过 finishTasksAndInvalidate()invalidateAndCancel() 方法来使 session 失效,调用后者会立刻生效,而前者则会等待 session 明确完成或者失败后才会失效。至于这两个方法的调用时机,你可以在 URLSessionDelegate 或者 URLSessionDataDelegate 及其子类的某个方法中,也可以在控制器的 viewWillDisappear 中调用。不过我建议使用后一种处理方式,因为一个控制器可能存在多个请求任务,如果每个 Task 都销毁 Session 也就表明同一个 Session 在每个 Task 开始的时候都需要初始化,这不仅导致代码冗余也降低了代码效率。

URLSessionConfiguration

URLSessionConfiguration 对象用于对 URLSession 对象进行初始化配置。这也是 URLSession 与 NSURLConnection 相比最明显的改进之一,我们可以配置每个 session 的缓存,协议,cookie,以及证书策略(credential policy),甚至跨程序共享这些信息。这将允许程序和网络基础框架之间相互独立,不会发生干扰。

URLSession 对象中的 configuration 属性,其实是在进行初始化时 URLSessionConfiguration 对象的拷贝,并且该属性为只读属性。也就是说每个 URLSession 对象只在初始化时配置 configuration,之后都不会发生改变。

URLSessionConfiguration 有三类工厂方法:

default:返回标准的 configuration,使用了全局的磁盘缓存(除了文件下载任务外)、钥匙串中的证书、Cookies。

ephemeral:类似于default,但是所有的数据都存储在内存中,不会对缓存、Cookie 和证书进行持久化存储。可以将这个配置看作是私有 session,对于实现像秘密浏览功能来说是非常理想的。

background:该配置会创建一个后台 session。后台 session 不同于常规情况,它甚至可以在应用程序挂起,退出或者崩溃的情况下运行上传、下载任务。

URLSessionConfiguration 还有如:超时时间、缓存策略、Cookie 策略、安全策略等属性的设置,具体的配置选项可以自行查看文档。

URLSessionTask

URLSessionTask 是一个抽象类,它表示一次网络任务。URLSession 通过创建不同的 URLSessionTask 对象来处理各种不同的网络请求任务,所以 URLSessionTask 有多个类型的子类:

URLSessionDataTask:该类用于处理 HTTP 中 GET、POST 方法获取的数据

URLSessionUploadTask:该类用于处理 HTTP 中 POST、PUT 方法上传数据到服务器

URLSessionDownloadTask:该类用于处理从服务器下载文件的网络任务

URLSessionStreamTask:该类用于处理 TCP/IP 连接的网络任务(新增的类型,未使用过。猜测用于视频、IM 类应用)

所有这些任务都可以挂起、开始、取消,下载任务甚至可以实现断点续传。这些 task 获得的数据的处理方式可以通过 completionHandler 闭包或者 delegate 中的方法,但是二者取其一。

Data task 可以通过 URL 或 URLRequest 创建(使用前者相当于是使用一个对于该 URL 进行标准 GET 请求的 URLRequest,这是一种快捷方法)。下面示例为从 itunes 中查询某个关键词的歌曲:

let expectedCharSet = CharacterSet.urlQueryAllowed
let searchTerm = searchBar.text!.addingPercentEncoding(withAllowedCharacters: expectedCharSet)!

let defaultSession = URLSession.shared
let url = URL(string: "https://itunes.apple.com/search?media=music&entity=song&term=(searchTerm)")

dataTask = defaultSession.dataTask(with: url!, completionHandler: {
    data, response, error in
    ...
}) 

dataTask?.resume()

上传、下载文件的代码与上面的基本一样,除了新建 dataTask 的类型不同。

总结

总体来说苹果对 URLSession 体系的设计这套体系清晰、简洁、高效,也是我们在日常编码过程需要认真学习的。作为 iOS 程序员除了努力搬砖外,更应该认真对待这些设计思想,不要成为依靠 cocoapods 生存的浮萍。所以在使用轮子的时候,一定不能忘了构建轮子的基本知识,这些基础才是程序员生根的关键。iOS 只不过是表明了当前我们专注的领域,而程序员才是我们真正的职业。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/16696.html

相关文章

  • Unix 网络 IO 模型: 同步异步, 傻傻分不清楚?

    摘要:出处阻塞非阻塞同步异步这些术语相信有不少朋友都也不同程度的困惑吧我原来也是什么同步非阻塞异步非阻塞的搞的头都大了后来仔细读了一遍网络编程卷一套接字联网第三版的章节终于把这些名词搞懂了下面我以网络编程卷一套接字联网第三版的章节的内容为准整理了 出处 阻塞 IO, 非阻塞 IO, 同步 IO, 异步 IO 这些术语相信有不少朋友都也不同程度的困惑吧? 我原来也是, 什么同步非阻塞 IO, ...

    1fe1se 评论0 收藏0
  • ios好文

    摘要:在上面的中,苹果还对具体的细节做出了要求。不过,就在今天,苹果宣布将这个无限期推迟。不网络请求之与的二次封装及意义之后,被苹果抛弃,该来的即便是迟些,但最终肯定会来。适配,极光推送用户要做这处更改升级至建议尽快升级。 iOS10 通知 extension 之 Service Extension 你玩过了吗? iOS10 通知 extension 之 Service Extension ...

    Caizhenhao 评论0 收藏0
  • Linux网络IO模型

    摘要:多个函数即多个请求,会挂在内核中操作系统会轮询检查数据报是否准备好再返回可读条件即就绪应用程序再发起函数拷贝内核中的数据和对一个,两次调用,两次返回,比阻塞并没有什么优越性关键是能实现同时对多个进行处理。 Linux网络IO模型 showImg(https://segmentfault.com/img/bVbtwUB?w=600&h=344); 阻塞IO模型 showImg(http...

    WelliJhon 评论0 收藏0
  • iOS进阶

    摘要:然而,副作用对于系统的可测试性来说就是一剂毒药,并且可能会因应用程序和请求的不同而出现差异性。这些事件并不具备特定时序性,甚至它们可能同时发生。粘性动画中,粘性小球会根据移动距离的大小拥有不同的弹性程度。 PPAsyncDrawingKit - 实现了一系列基础 UI 控件的轻量级 ASDK 一款轻量级的 ASDK,实现了一系列基础 UI 控件。 iOS 开发之 Runtime 常用示...

    Cheng_Gang 评论0 收藏0
  • 【超齐全】iOS 学习资料整理

    好赶货,收藏。原文iOS 学习资料整理 这份学习资料是为 iOS 初学者所准备的, 旨在帮助 iOS 初学者们快速找到适合自己的学习资料, 节省他们搜索资料的时间, 使他们更好的规划好自己的 iOS 学习路线, 更快的入门, 更准确的定位的目前所处的位置. 该文档会持续更新, 同时也欢迎更多具有丰富经验的 iOS 开发者将自己的常用的一些工具, 学习资料, 学习心得等分享上来, 我将定期筛选合...

    Flands 评论0 收藏0
  • iOS 学习资料整理

    摘要:这份学习资料是为初学者所准备的旨在帮助初学者们快速找到适合自己的学习资料节省他们搜索资料的时间使他们更好的规划好自己的学习路线更快的入门更准确的定位的目前所处的位置该文档会持续更新同时也欢迎更多具有丰富经验的开发者将自己的常用的一些工具学习 这份学习资料是为 iOS 初学者所准备的, 旨在帮助 iOS 初学者们快速找到适合自己的学习资料, 节省他们搜索资料的时间, 使他们更好的规划好自...

    everfly 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<