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文件下载