之一
代碼Demo
Github:SYDownloadManager
NSOperationQueue可以方便的實現(xiàn)多任務(wù)的處理,對于簡單的多任務(wù)使用NSBlockOperation和NSInvocationOperation即可很好的處理。但是對于復(fù)雜的多任務(wù)该互,比如使用NSURLSession實現(xiàn)下載欲低,使用NSOperationQueue對下載任務(wù)進(jìn)行辕宏、開始、暫停砾莱、重啟瑞筐、取消以及進(jìn)度等的操作時,卻感覺無從下手腊瑟【奂伲總覺得NSBlockOperation和NSInvocationOperation這兩個operation干的是一錘子買賣块蚌,就是將下載任務(wù)扔到block中或者selector中等待Queue的自動調(diào)度,不用進(jìn)行進(jìn)度監(jiān)控膘格,和暫停重啟等操作峭范。為學(xué)習(xí)多線程,解決心中的疑惑瘪贱,特意結(jié)合以前所知所得虎敦,實現(xiàn)了該功能,并記錄下來政敢,讓大家少踩一些坑其徙。
1.斷點下載實現(xiàn)原理
利用http請求頭 range:bytes=start-end 實現(xiàn)
2.對NSURLSession、NSURLSessionDataTask和NSOperation喷户、NSOperationQueue核心點的理解
首先應(yīng)該對Queue自動調(diào)度Operation有一個初步的了解唾那;每一個Operation有ready(準(zhǔn)備狀態(tài))、executing(運行狀態(tài))褪尝、cancled(取消狀態(tài))闹获、finished(結(jié)束狀態(tài))等狀態(tài)。
其中ready是Queue調(diào)用addOperation:后Operation的狀態(tài)河哑,表明該Operation可以被Queue自動調(diào)度避诽,當(dāng)合適的時機時Operation的start方法會被調(diào)用,Operation會處于executing ==yes的狀態(tài)璃谨,切記ready狀態(tài)是個坑點I陈!<淹獭拱雏!
Queue如何獲取合適的時機呢?底扳?原來Queue是通過KVO來獲知Operation的狀態(tài)铸抑,當(dāng)Operation處于ready時且operationCount小于maxConcurrentOperationCount,就自動調(diào)用該Operation的start方法衷模,讓這個任務(wù)開始運行鹊汛。
finished狀態(tài)是表明該Operation已經(jīng)結(jié)束,Queue獲取了這個Operation的Finished==YES時阱冶,會自動的將該Operation從Queue的隊列中移除刁憋。這個finished也是個關(guān)鍵點。
其次熙揍,對NSURLSession和NSURLSessionTask的認(rèn)知职祷;一個Session可以個維持若干個Task氏涩,Session可以通過回調(diào)知道每個task的運行情況比如task的進(jìn)度届囚,結(jié)束后的緩存路徑等有梆;而task的開啟(resume)、暫停(suspend)意系、重啟(resume)是由自身來控制泥耀,且task保留她的這些狀態(tài)。
這時就可以看到一個共同的相似點蛔添,Queue管理Operation痰催,Session管理Task;Queue通過KVO獲知Operation的狀態(tài)迎瞧,Session可以通過代理獲知task的狀態(tài)夸溶。因此,可以把Task和Operation結(jié)合(自定義Operation)凶硅,實現(xiàn)下載任務(wù)的手動開啟暫停重啟等缝裁,通過Session的回調(diào)獲知task的進(jìn)度,通過Queue自動調(diào)度TaskOperation足绅;?
3.如何自定義NSOperation
1.要可以下載捷绑;TaskOperation有一個NSURLSessionDataTask的屬性
2.Queue可以自動開始下載;在TaskOperation中重寫start方法氢妈,并且啟動【dataTask resume】
3.Queue可以獲知TaskOperation的下載完成和finished==YES狀態(tài)粹污,可以在合適的時機自動調(diào)用另一個TaskOperation的start方法,又首量,dataTask并不能獲知自己是否下載完畢壮吩,所以需要暴露一個completionTask的方法;注意這里finished==yes加缘,且使用KVO
4.cancle方法的重寫粥航,在這里記得取消下載任務(wù)
5.其他暴露的方法,很清晰生百。注意每次不論開始還是重啟新建一個TaskOperation就可以了递雀。。問我為什么蚀浆?一個是因為斷點的缀程,一個是Queue是會自動移除Operation的
以上自定義NSOperation就完成了,很簡單
4.如何實現(xiàn)TaskOperation的調(diào)度市俊?杨凑??
沒有實現(xiàn)一說摆昧,是自動調(diào)度的撩满,只用設(shè)置最大并發(fā)數(shù)并將TaskOperation添加到Queue中就行了,只用記著在Session的Task完成的回調(diào)中調(diào)用該【TaskOperation completionTask】就行了
SYDownloadTaskManager的一些方法
?下載任務(wù)完成的回調(diào)處理
后續(xù):之二