NSURLSession前台下载/后台下载/断点下载的代理执行路径(二)

后台情况

六.NSURLSession前台下载开始--------->切换后台----(下载未结束)----->切换前台--------->下载结束。

此时的调用与完全在前台执行相同。


七.NSURLSession前台下载开始--------->切换后台----(下载已结束)----->切换前台。


1.在下载过程中,NSURLSessionDownloadDelegate的 


URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite (int64_t)totalBytesExpectedToWrite

接口会多次调用,在此接口中可进行下载进度的记录或更新UI的下载进度条。


2.切换后台。


3.后台的所有下载任务结束,此时会调用Appdelegate的

- (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)())completionHandler

此方法中的completionhandler的block需要被变量引用,以备在后续方法中执行。



4.执行NSURLSessionDownloadDelegate的方法

- (void)URLSession:(NSURLSession *)session
      downloadTask:(NSURLSessionDownloadTask *)downloadTask
didFinishDownloadingToURL:(NSURL *)location {
    
    NSLog(@"------这是NSURLSessionDownloadDelegate 的 didFinishDownloadingToURL:location");
    
    
    NSLog(@"downloadTask:%lu didFinishDownloadingToURL:%@", (unsigned long)downloadTask.taskIdentifier, location);
    NSString *locationString = [location path];
    NSString *finalLocation = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:[NSString stringWithFormat:@"%lufile",(unsigned long)downloadTask.taskIdentifier]];
    NSError *error;
    [[NSFileManager defaultManager] moveItemAtPath:locationString toPath:finalLocation error:&error];
    
    // 用 NSFileManager 将文件复制到应用的存储中
    // ...
    
    // 通知 UI 刷新
}

此接口中的location参数记录下载的tmp文件的存储路径,在此接口中需将下载的tmp文件重新保存至最终的保存地址中。



5.调用NSURLSessionTaskDelegate的 

URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error

当下载成功时,error参数为nil。



6.当NSURLSessionTaskDelegate以及NSURLSessionDownloadDelegate的代理方法调用完成后调用NSURLSessionDelegate的方法

- (void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session {
    

    NSLog(@"------这是NSURLSessionDelegate 的 URLSessionDidFinishEventsForBackgroundURLSession ");
    
    NSLog(@"Background URL session %@ finished events.\n", session);
    
    if (session.configuration.identifier) {
        // 调用在 -application:handleEventsForBackgroundURLSession: 中保存的 handler
        [self callCompletionHandlerForSession:session.configuration.identifier];
    }
}

在该方法中待所有载数据管理和UI刷新做完后,再调用3中引用的completionHandler()的block。





八.NSURLSession前台下载开始--------->切换后台----(下载未结束)--------->下载失败----->切换前台。

九.NSURLSession前台下载开始--------->切换后台----(下载未结束)--------->退出应用----->应用重新打开--------->重新恢复下载--------->下载结束。

此过程同四中的NSURLSession前台下载开始--------->应用退出--------->应用重新打开--------->重新恢复下载--------->下载结束。


十.NSURLSession前台下载开始--------->切换后台----(下载未结束)--------->下载失败--------->退出应用----->应用重新打开--------->重新恢复下载--------->下载结束。


十一.NSURLSession前台下载开始--------->切换后台----(下载已结束)--------->退出应用---->应用重新打开。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值