我正在处理从我们的服务器下载文件的应用程序(相当大的文件)。我在前台和后台管理下载文件(不关闭应用程序)。我的问题是使用多任务屏幕用户故意关闭应用程序的情况。
在这种情况下,我在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)
}
}
}
但有些东西没有正常工作,我无法调试它,因为我需要杀死基本上杀死调试过程的应用程序。
答案 0 :(得分:0)
它不能用作应用程序已经被终止,只给你很少的时间(大约5秒)来保存你的东西。
要处理您的案件,请参阅apple docs
中的以下注释如果iOS应用程序被系统终止并重新启动,则该应用程序可以 使用相同的标识符来创建新的配置对象和 会话并检索正在进行的传输的状态 终止的时间。此行为仅适用于正常情况 系统终止应用程序。 如果用户终止该应用 从多任务屏幕,系统取消所有会话 背景转移。
所以看起来你必须在你的情况下定义一些自定义来处理这个,因为你说NUUser默认但我建议使用NSURLCache。
答案 1 :(得分:0)
将其保存在NSUserDefaults
可能是最好的选择。然后,当用户重新启动应用程序时,使用相同的标识符重新创建后台会话,然后使用恢复数据重新创建任务。如果其中任何一个无法恢复,您将获得新的下载。 (毕竟,恢复是最好的努力。)
然而,很有可能您无法获得简历数据,因为在您提出要求时任务将会消失。
此外,如果您要处理大量文件,请考虑将简历数据存储在单独的文件中,以便NSUserDefaults不会变得庞大。