在使用NSURLSessionDownloadTask时,使用resumeData的正确方法是什么?

时间:2015-10-07 14:15:03

标签: ios swift nsurlsession resume nsurlsessiondownloadtask

我正在处理从我们的服务器下载文件的应用程序(相当大的文件)。我在前台和后台管理下载文件(不关闭应用程序)。我的问题是使用多任务屏幕用户故意关闭应用程序的情况。

在这种情况下,我在didCompleteWithError方法上收到回调,并收到error.userInfo包含NSURLSessionDownloadTaskResumeData密钥下的恢复数据NSData对象的错误。< / p>

问题是:应该如何处理这种情况?我应该使用didCompleteWithError方法中的downloadTaskWithResumeData立即启动另一个任务,还是需要在UserDefaults中保存resumeData NSData对象,并在下次运行应用程序时使用它?

我试图在didCompleteWithError

中做类似的事情
if (error?.userInfo[NSURLSessionDownloadTaskResumeData] != nil) {
                Logger.printLogToConsole(self.TAG, aMethodName: __FUNCTION__, aMessage: "Resume data was found");
                let req = task.originalRequest
                let languageCodeWrapped: AnyObject? = NSURLProtocol.propertyForKey("languageCode", inRequest:req!)!
                if let languageCode = languageCodeWrapped {
                    SessionDownloader.sharedInstance.downLoadWithResumeData(languageCode as! String, aResumeData: error?.userInfo[NSURLSessionDownloadTaskResumeData] as! NSData)
                    if taskDelegate != nil {
                        DownloadSessionDelegate.sharedInstance.setDelegateForTaskId(taskDelegate, taskId: "\(task.taskIdentifier)", code: languageCode as! String)
                    }
                }
            }

但有些东西没有正常工作,我无法调试它,因为我需要杀死基本上杀死调试过程的应用程序。

2 个答案:

答案 0 :(得分:0)

它不能用作应用程序已经被终止,只给你很少的时间(大约5秒)来保存你的东西。

要处理您的案件,请参阅apple docs

中的以下注释
  

如果iOS应用程序被系统终止并重新启动,则该应用程序可以   使用相同的标识符来创建新的配置对象和   会话并检索正在进行的传输的状态   终止的时间。此行为仅适用于正常情况   系统终止应用程序。 如果用户终止该应用   从多任务屏幕,系统取消所有会话   背景转移。

所以看起来你必须在你的情况下定义一些自定义来处理这个,因为你说NUUser默认但我建议使用NSURLCache。

答案 1 :(得分:0)

将其保存在NSUserDefaults可能是最好的选择。然后,当用户重新启动应用程序时,使用相同的标识符重新创建后台会话,然后使用恢复数据重新创建任务。如果其中任何一个无法恢复,您将获得新的下载。 (毕竟,恢复是最好的努力。)

然而,很有可能您无法获得简历数据,因为在您提出要求时任务将会消失。

此外,如果您要处理大量文件,请考虑将简历数据存储在单独的文件中,以便NSUserDefaults不会变得庞大。