NSURLSession应用--音乐播放器

这篇博客分为五个部分,前面四个部分是对NSURLSession的总结;最后一个部分通过一个音乐播放器的Demo来进行实际操练。这个音乐播放器有以下功能:查询歌曲--下载歌曲--保存并播放歌曲--查看下载过程--继续暂停取消下载歌曲。

Demo

#1 NSURLSession简介

1.NSURLSession是苹果为我们提供的一套新的网络处理库。

--NSURLSession负责接收和发送请求;

--NSURLSessionConfiguration负责配置session属性;

--Delegate负责监听网络操作中发生的事件

--NSURLSessionTask负责实际的工作:获取数据,上传和下载文件。

总的说来,NSURLSession通过两种方式来获取数据:通过completion handler或者代理方法。

NSURLSession

2.NSURLSession优点在于:

--接口简单。不用担心之前NSURLConnection使用复杂的问题

--能满足我们的基本的网络请求需求。(与AFNetWorking没有区别,但一些加强功能除外)

--系统原生提供,不用做任何额外的导入操作,就可直接使用。

3.与Alamofire对比,不足在于:没有提供很方便的自动数据类型转换。比如,Alamofire 中可以自动将服务端返回的 JSON 数据识别并解析出来,而使用 NSURLSession 则需要自己来完成。

4.示例

用NSURLSession进行基本的网络请求

使用NSURLSession.sharedSession()来获取NSURLSession的实例,然后调用dataTaskWithURL()方法传入url,最后在闭包中处理请求返回的结果。

必须手动调用resume()方法才会开始请求。因为NSURLSession默认是不启动resume()的。

#2 NSURLSession详细接口

NSURLSession本身是不会进行请求的,只有通过创建task的形式进行网络请求。一个NSURLSession可以创建多个task,并且这些task之间的cache和cookie是共享的。

三种task之间的关系

--NSURLSessionDataTask:这就是刚才创建的data task,它用于读取服务端的简单数据,不如JSON数据

--NSURLSessionDownLoadTask:文件下载。针对大文件的网路请求做了一些处理,如:下载进度,断点续传。

--NSURLSessionUpLoadTask:文件上传。供服务端发送文件类型的数据使用。

(1)下载文件示例

NSURLSessionDownLoadTask

使用downloadTaskWithURL方法来下载文件,这个方法的闭包中会接受一个location参数,它表示下载好的文件的存放位置。

注意:downloadTaskWithURL会将文件保存在一个临时目录中,location指向这个临时目录的位置。如果要持久保存文件,需将此文件从临时目录中移动出来。

(2)上传文件示例.使用uploadTaskWithRequest方法

NSURLSessionUploadTask

#3 NSURLSessionConfiguration

1.为什么需要用NSURLSessionConfiguration?

用NSURLSession.sharedSession()方法创建的实例是全局的,没有代理对象,功能受限--比如说,不能检测下载速度,不能设置后台的下载机制。

所以,我们需要用NSURLSessionConfiguration对象来配置NSURLSession实例。

NSURLSession定义了两个配置方法:

--init(configuration:)

--init(configuration:delegate:delegateQueue:)

2.NSURLSessionConfiguration的三个默认初始化方法

--defaultSessionConfiguration:默认配置,使用全局的缓存,cookie信息。

--ephemeralSessionConfiguration:私有的Session。不会对缓存或cookie进行存储。相当于浏览器的隐私模式。

--backgroundSessionConfiguration:当应用切换到后台时,网络操作依然可以继续进行。

3.一旦用配置好的 NSURLSessionConfiguration 初始化 NSURLSession 实例后,就不能修改这个 NSURLSession 相关的配置了。所以,一切的配置操作都放在初始化 NSURLSession 之前。

#4 Delegate

NSURLSession的代理对象结构

--NSURLSessionDelegat作为所有代理的基类,定义了网络请求最基础的代理方法

--NSURLSessionTaskDelegate定义的网络请求任务相关的代理方法

--NSURLSessionDownloadDelegate用于下载任务相关的代理方法,比如查看下载进度

--NSURLSesssionDataDelegate用于普通数据任务和上传任务

#5 Demo

1.查询歌曲

--声明一个session常量和一个data task变量

SearchViewController.swift

--更新searchBarSearchButtonClicked(_:)方法

SearchViewController.swift

运行一下,现在是这样的!

simulator

2.下载歌曲

(1)新建一个文件,命名为Download。

Download.swift

(2) 添加一个变量,来存储urls和Download之间的映射关系。

SearchViewController.swift

(3)创建一个download task

思路是:配置session,配置delegate,更新开始下载的方法

--在ViewDidLoad()方法前声明变量.

问题一:lazy修饰符什么作用?表示这个属性是延迟加载的。除了能节省内存分配时间优化性能--在需要的时候downloadsSession才被创建出来;更重要的是,它能让你在self还没初始化的时候,就能将self作为delegate 参数传给构造器。

问题二:delegateQueue的参数为什么是nil?这能让session创建一个serial operation queue,来实现delegate方法和completion handler方法。

SearchViewController.swift

--实现NSURLSessionDownloadDelegate方法.当下载完成时,在控制台输出“Finished downloading”

SearchViewController.swift

--更新开始下载的方法.

SearchViewController.swift

3.保存和播放歌曲

当一个download task完成后,URLSession(_:downloadTask:didFinishDownloadingToURL:)方法提供了临时文件位置的URL。你需要做的是,在这个方法返回结果前,将这个URL移到app的沙盒容器目录中。同样,你需要从字典里将正在下载的download移走,并更新table view。

实现思路是:找出有request url歌曲的index --清除临时文件位置上的文件--将文件从临时文件位置复制到本地路径--移除activeDownloads数组中的download--更新table view

--添加一个方法,它会返回在searchResults列表中的歌曲的index。遍历searchResults数组,找出已经有url的歌曲。

SearchViewController.swift

--更新delegate方法

SearchViewController.swift

运行一下,在console里,你可以看到destinationURL

destinationURL

在模拟器里,点击下载好的歌曲,便能进行播放啦!

simulator

4. 查看下载进度

--添加代理方法

SearchViewController.swift

--更新cell配置。找到tableView(_:cellForRowAtIndexPath:)方法。

SearchViewController.swift

现在歌曲下载是这样的:

simulator

5.暂停,继续,取消下载

--添加这三个方法。

暂停下载和取消下载的不同之处在于暂停下载还会产生resumeData。

在继续下载和暂停下载方法中,isDownLoading作为flag标记,用来表示下载是否已经开始。

SearchViewController.swift

--更新cell配置方法。cell有两个button,一个button在“resume”和“pause”之间切换,另外一个button的title为“cancel”。

isDownloading作为flag,来判断是否处在暂停状态。如果没有处在暂停状态,”Pause“,否则,就”Resume“;
button只有在下载时才出现

运行一下,现在是这样的

simulator

完结。

项目地址:github.com/Paganarchitect/iOS_tutorial_exercises_RayWenderlich.git

参考博客:NSURLSession Tutorial: Getting Started

NSURLSession 网络库 - 原生系统送给我们的礼物

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容