自定义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的自动调度接续上。。。。。。


以上问题解决。。。

后续:之三

你可能感兴趣的:(自定义NSOperation利用NSURLSession、NSOperationQueue实现多线程断点下载(2))