自定義NSOperation利用NSURLSession、NSOperationQueue實現多線程斷點下載(2)

之二

接上文

代碼Demo

Github:SYDownloadManager

4.如何實現TaskOperation的調度???

沒有實現一說,是自動調度的,只要設置最大并發數并將TaskOperation添加到Queue中就行了,只用記著在Session的Task完成的回調中調用該【TaskOperation completionTask】就行了

SYDownloadTaskManager的一些方法

?下載任務完成的回調處理

5.對SYDownloadTaskManager的介紹


1.SYDownloadTaskModel 這個類主要是模型,記錄下載任務的一些必要狀態和信息以及實現歸檔操作

2.SYDownloadTaskStore是存儲Model以及實現數據緩存到本地的

3.SYDownloadTaskOperation 是封裝了NSURLSessionDataTask的自定義Operation

4.SYDownloadTaskManager 是封裝了NSURLSession,NSOperationQueue,SYDownloadTaskStore,實現并發下載,下載控制,數據流獲取、儲存,以及提供下載任務狀態的核心類

5.NSoperationQueue + SYDelayAddOperation,為Queue提供了額外的方法,以及解決了一些關鍵問題

6. XXXoperation went isFinished == YES without being started by the queue it is in 問題的解決!!!!!

這個錯誤的意思是:沒有調用start方法,卻改變了operation的狀態(isFinished == YES)導致queue對operation的調度出現錯亂

1.什么操作導致這個問題?

?當一個Operation已經被Queue addOperation,此時由于Queue已經達到最大操作數,即,operationCount > maxConcurrentOperationCount。則這個Operation會處于ready狀態,Queue會隨時調度這個Operation,讓其開始任務,即,Queue自動調用start方法。然而當Operation處于ready狀態時,如果要取消(改變了Operation的狀態),就會出現沒start就finished的問題;

2.如何解決這個問題??

既然是因為Operation處于ready==YES時造成的,那就不讓多余的Operation addOperation: 就可以了。這是NSoperationQueue + SYDelayAddOperation 就起作用了

通過使用syDelay_addOperation: 將多余的添加到waitingOperations中即可,不多余的正常添加即可,再進行刪除暫停操作就沒事了

但是此時會出現一個新問題,由于Queue中沒有處于ready的Operation,Queue在已添加的Operation Finished == YES 后并不會自動開始下一個Operation,這就背離了使用NSOperationQueue實現Operation自動調度的初衷。。。。。。。

3.如何解決不能自動調度的問題???

如果我們可以在合適的時機,自己調用 addOperation 將waitingOperations中最早等待的Operation添加到Queue中就可以了。完美的思路!!!!!!

啊哈哈哈,文檔中表明NSOperationQueue 的operationCount可以使用KVO,只要監控operationCount? <?maxConcurrentOperationCount ,將waitingOperations中的firstObject【Queue addOperation: firstObject】就可以使Queue的自動調度接續上。。。。。。


以上問題解決。。。

后續:之三

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容