4 objective-c ios ios7 nsurlsession nsurlsessiondownloadtask
我知道我可以dataTaskWithURL:completionHandler:用来获取completionHandler块中的数据,但是阻止了委托方法的触发,我需要触发didReceiveData:方法,因为它是我配置进度指示器的方式.
一旦完成,我完全不知道如何获取下载的数据.什么是委托方法相当于完成块?didCompleteWithError似乎没有返回任何NSData.
我没有手动将数据拼凑在一起didReceiveData,是吗?当完成处理程序只是把它交给你时,这似乎真的很蹩脚.我不介意这样做,如果不是因为我可以同时下载50多个东西,所以跟踪所有部分数据似乎是屁股的痛苦.我应该切换到NSURLSessionDownloadTask吗?
是的,您必须手动将数据分块(或者如果它非常大并且您不希望它占用内存,则可以将其流式传输到文件中).
因此,didReceiveData方法将在数据进入时返回.因此,您应该实例化一个NSMutableData(例如,in didReceiveResponse)didReceiveData将数据附加到其中.当didCompleteWithError调用时,假设错误是nil,您可以确信您NSMutableData现在包含收到的所有数据.正如您所指出的,挑战在于跟踪所有50多个下载,因此我维护一个由任务标识符键入的字典,以跟踪将数据附加到哪个字典.(就个人而言,我认为这是一个设计缺陷,它NSURLSession在会话级实现任务,下载和上传代理,而不是让我们为每个任务实例化单独的任务委托对象.但我们仍然坚持我们所拥有的.)
如果您只是下载数据,那么它NSURLSessionDownloadTask是一个很好的选择(并且在内存使用方面比仅仅附加到NSMutableData实例更有效),并且您可以想象如果您愿意也可以使用后台会话(您不能使用a NSURLSessionDataTask).
最后,如果您真的要进行50次以上的下载,您可能需要考虑将下载任务包装在NSOperation子类中,这样您就可以限制并发运行的数量,而不会有任何超时的风险.