自定义NSOperation利用NSURLSession、NSOperationQueue实现多线程断点下载(1)

之一

代码Demo

Github:SYDownloadManager

NSOperationQueue可以方便的实现多任务的处理,对于简单的多任务使用NSBlockOperation和NSInvocationOperation即可很好的处理。但是对于复杂的多任务,比如使用NSURLSession实现下载,使用NSOperationQueue对下载任务进行、开始、暂停、重启、取消以及进度等的操作时,却感觉无从下手。总觉得NSBlockOperation和NSInvocationOperation这两个operation干的是一锤子买卖,就是将下载任务扔到block中或者selector中等待Queue的自动调度,不用进行进度监控,和暂停重启等操作。为学习多线程,解决心中的疑惑,特意结合以前所知所得,实现了该功能,并记录下来,让大家少踩一些坑。

1.断点下载实现原理

利用http请求头 range:bytes=start-end 实现

2.对NSURLSession、NSURLSessionDataTask和NSOperation、NSOperationQueue核心点的理解

首先应该对Queue自动调度Operation有一个初步的了解;每一个Operation有ready(准备状态)、executing(运行状态)、cancled(取消状态)、finished(结束状态)等状态。

其中ready是Queue调用addOperation:后Operation的状态,表明该Operation可以被Queue自动调度,当合适的时机时Operation的start方法会被调用,Operation会处于executing ==yes的状态,切记ready状态是个坑点!!!!

Queue如何获取合适的时机呢??原来Queue是通过KVO来获知Operation的状态,当Operation处于ready时且operationCount小于maxConcurrentOperationCount,就自动调用该Operation的start方法,让这个任务开始运行。

finished状态是表明该Operation已经结束,Queue获取了这个Operation的Finished==YES时,会自动的将该Operation从Queue的队列中移除。这个finished也是个关键点。

其次,对NSURLSession和NSURLSessionTask的认知;一个Session可以个维持若干个Task,Session可以通过回调知道每个task的运行情况比如task的进度,结束后的缓存路径等;而task的开启(resume)、暂停(suspend)、重启(resume)是由自身来控制,且task保留她的这些状态。

这时就可以看到一个共同的相似点,Queue管理Operation,Session管理Task;Queue通过KVO获知Operation的状态,Session可以通过代理获知task的状态。因此,可以把Task和Operation结合(自定义Operation),实现下载任务的手动开启暂停重启等,通过Session的回调获知task的进度,通过Queue自动调度TaskOperation; 

3.如何自定义NSOperation

1.要可以下载;TaskOperation有一个NSURLSessionDataTask的属性

2.Queue可以自动开始下载;在TaskOperation中重写start方法,并且启动【dataTask resume】

3.Queue可以获知TaskOperation的下载完成和finished==YES状态,可以在合适的时机自动调用另一个TaskOperation的start方法,又,dataTask并不能获知自己是否下载完毕,所以需要暴露一个completionTask的方法;注意这里finished==yes,且使用KVO

4.cancle方法的重写,在这里记得取消下载任务


5.其他暴露的方法,很清晰。注意每次不论开始还是重启新建一个TaskOperation就可以了。。问我为什么?一个是因为断点的,一个是Queue是会自动移除Operation的

以上自定义NSOperation就完成了,很简单

4.如何实现TaskOperation的调度???

没有实现一说,是自动调度的,只用设置最大并发数并将TaskOperation添加到Queue中就行了,只用记着在Session的Task完成的回调中调用该【TaskOperation completionTask】就行了

SYDownloadTaskManager的一些方法

 下载任务完成的回调处理

后续:之二

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

推荐阅读更多精彩内容