NSURLSessionDownloadTask 在后台发起URLSession completionHandler

Posted

技术标签:

【中文标题】NSURLSessionDownloadTask 在后台发起URLSession completionHandler【英文标题】:NSURLSessionDownloadTask initiation in backgroundURLSession completionHandler 【发布时间】:2015-05-08 13:29:53 【问题描述】:

我有一种情况,我需要按顺序下载多个文件,因为每次下载都取决于之前下载的文件。 (我正在后台处理文件)

我正在使用 NSURLSessionConfiguration 背景会话配置。

有一种情况是 NSURLSessionDownloadTask 在应用程序处于后台时启动。这会使用 Assertion allowedbackgroundduration 使应用程序崩溃。

所以,我的问题是,我在后台启动下载任务是不是做错了???

提前致谢, - 萨提亚

【问题讨论】:

您是否在应用程序委托中捕获handleEventsForBackgroundURLSession 中的completionHandler?并且,在URLSessionDidFinishEventsForBackgroundURLSession 在你的NSURLSessionDelegate 中,在发起其他后台请求后,你是否调用了保存的completionHandler 我不确定这个...我正在为所有下载对象发送相同的消息,所以我觉得这是自动完成的... 请看我对莱昂纳多对上述事情的回复的评论 您向我们展示了保存完成处理程序的代码,很好,但是您在哪里调用该完成处理程序?您的错误表明您没有足够快地调用完成处理程序,这意味着您在执行此操作之前花费了太多时间(我认为您有 30 秒之类的时间,所以我觉得这很令人惊讶)或者您不知何故根本忽略了调用它。 【参考方案1】:

您在后台的时间有限,因此您处理文件的时间可能太长。 如果您没有足够快地调用完成处理程序,系统将会使您的应用崩溃。

或者您可能犯了一个错误,并且您根本没有在 NSURLSessionDownloadTask 在后台启动的场景中调用完成处理程序。

【讨论】:

这是用于保存完成处理程序的代码 sn-p -(void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)())completionHandler self.backgroundTransferCompletionHandler = completionHandler; 我正在尝试读取文件并在后台将它们保存到本地数据库中......这可能是个问题吗? 有可能。您可以尝试记录在数据库中读取和保存文件所花费的时间。正如 Rob 所说,我相信您必须在后台处理的时间约为 30 秒。 说得很好...在后台处理文件的时间太长了...无论如何感谢大家的讨论...

以上是关于NSURLSessionDownloadTask 在后台发起URLSession completionHandler的主要内容,如果未能解决你的问题,请参考以下文章

NSURLSessionDownloadTask 进度回调不顺畅?

在 NSMutableDictionary 中设置 NSURLSessionDownloadTask

NSUrlSessionDownloadTask - 进入后台时出现didCompleteWithError

iOS开发之网络编程--2NSURLSessionDownloadTask文件下载

NSURLSessionDownloadTask 在挂起时继续下载

在下载字节时从 NSURLSessionDownloadTask 访问字节