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

来源:互联网 发布:mac 怎么卸载jenkins 编辑:程序博客网 时间:2024/05/21 10:58

后台情况

六.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 *)downloadTaskdidFinishDownloadingToURL:(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
原创粉丝点击