eip*_*rol 11 session download ios nsurlsession
我需要在检查标题(对于长度和类型)后,使用后台才能下载某些文件(不是全部),但它必须在同一操作中,而不是创建新的任务/请求(因为有时我得到一个由于短时间内的许多连接而导致服务器出错.所以我开始任务:
NSURLSessionConfiguration *configuratione = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *sessione = [NSURLSession sessionWithConfiguration:configuratione delegate:self delegateQueue:nil];
NSURLSessionDataTask *datatask = [sessione dataTaskWithRequest:request];
[datatask resume];
Run Code Online (Sandbox Code Playgroud)
然后,我知道可以在收到第一个响应时将数据任务转换为下载任务,使用此委托:
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
didReceiveResponse:(NSURLResponse *)response
completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler
{
if(XXXXXXXXXX){
NSLog(@"transform into a download");
completionHandler(NSURLSessionResponseBecomeDownload);
}else{
NSLog(@"Keep loading normally");
completionHandler(NSURLSessionResponseAllow);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,由于Data Tasks无法使用BackgroundSessionConfiguration,我认为新创建的下载将使用相同的默认会话配置.如何在后台运行下载?有没有办法将它的会话改为后台会话?或者哪种方法?
J-Q*_*J-Q 10
这个问题很难给出一个明确的答案,接近我,所有3个主要的URLLoading因素(sessionType,taskType,FG/BG创建)都受到你的设计的限制.
由于会话在配置上保留了深层副本(确定默认/ BackGround/Ephemeral会话 - 自然类型),因此在启动会话后(在我们的例子中:您的默认类型会话),您无法修改配置对象本届会议不再.因此,如果您的设计不允许新的任务与新的(希望) BG类型会话相关联,则无法将"dataTask"神奇地转换为"downloadTask".
请记住,NSURLSessionDataTask和NSURLSessionDownloadTask是的两个子类NSURLSessionTask,NSURLSessionDataTask和NSURLSessionDownloadTask处理传入响应数据(分段VS文件明智分别)非常不同由框架实现.
一个有吸引力的错觉可能是这种有吸引力的方法URLSession:dataTask:didBecomeDownloadTask:,但您必须创建一个与当前(由您之前配置的默认类型深刻标记)会话相关联的新任务(DownloadTask in deed),并将原始任务(dataTask)保留为孤儿.我的理解是,由于额外创建任务,您的设计不能采用此选项,并且您必须保持默认类型会话配置.
URLSession:dataTask:didBecomeDownloadTask:应该真正命名为URLSession:dataTask:wasReplacedByDownloadTask:
我现在只有简单的解决方案是,在接收URLSession时,在Data-Task-Delegate (类实现NSURLSessionDataDelegate协议)中:dataTask:didReceiveData:初始调用,以某种方式开始存储这些分段数据(存储到临时文件中,也许,模拟NSURLSessionDownloadTask的默认操作,并确保在NSOperationQueue上异步执行此委托 (我猜你的"后台能力"意味着可以由NSOperationQueue强调线程机制提供的辅助线程),直到下载完成,然后检查你的存储累积结果(如果处理任何错误和/或将文件传输到其他地方)在这个一般的NSURLSessionTaskDelegate方法中"URLSession:task:didCompleteWithError:"
这样做,您将请求(由NSURLSessionDataTask表示)转换为下载(而不是NSURLSessionDownloadTask).为了满足此转换发生在后台队列上,为(委托/任务)此委托方法的最后一个参数提供非零值: - 否则,串行操作队列将无法满足您的"后台能力"需求
NSOperationQueue* aQueue = [[NSOperationQueue alloc] init];
NSURLSession *sessione = [NSURLSession sessionWithConfiguration:configuratione delegate:self delegateQueue: aQueue];
Run Code Online (Sandbox Code Playgroud)
其他想法将手动执行多个NSOperation对象,覆盖其启动方法以确保下载任务的异步执行,这可能有点棘手.
任何其他有更好解决方案的人,请带来更多的火花......或纠正我可能产生的任何误导.
| 归档时间: |
|
| 查看次数: |
3220 次 |
| 最近记录: |