使用 [NSURLSessionConfiguration backgroundSessionConfiguration] 时有没有办法消除延迟?
Posted
技术标签:
【中文标题】使用 [NSURLSessionConfiguration backgroundSessionConfiguration] 时有没有办法消除延迟?【英文标题】:Is there a way to remove the delay when [NSURLSessionConfiguration backgroundSessionConfiguration] is used? 【发布时间】:2014-02-19 04:24:43 【问题描述】:我正在尝试运行后台 NSURLSessionDownloadTask。但是,我注意到在任务实际开始之前大约需要 30 秒。当我使用 defaultSessionConfiguration 时,任务几乎立即开始。有没有办法在使用 backgroundSessionConfiguration 时立即触发 NSURLSessionDownloadTask?
以下是我使用 backgroundSessionConfiguration 时得到的结果:
NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration backgroundSessionConfiguration:[NSString stringWithFormat:bgIdentifier, self.urlModel.code]];
这里是日志输出。请注意,在调用“resume”方法之前会记录“Start uploading...”,并且在 NSURLSessionTaskDelegate 的 didSendData 方法中记录“Upload progress”。
2014-02-18 20:13:55.403 myapp[396:60b] [DoneViewController] Start uploading...
2014-02-18 20:14:17.699 myapp[396:60b] [DoneViewController] Upload progress - 1%
2014-02-18 20:14:17.704 myapp[396:60b] [DoneViewController] Upload progress - 2%
2014-02-18 20:14:17.705 myapp[396:60b] [DoneViewController] Upload progress - 3%
2014-02-18 20:14:17.706 myapp[396:60b] [DoneViewController] Upload progress - 4%
仅供参考,相同但使用默认会话配置。
NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
您可以看到控制台结果没有延迟是这样的:
2014-02-18 19:57:00.552 myapp[376:60b] [DoneViewController] Start uploading...
2014-02-18 19:57:00.707 myapp[376:60b] [DoneViewController] Upload progress - 2%
2014-02-18 19:57:00.710 myapp[376:60b] [DoneViewController] Upload progress - 5%
2014-02-18 19:57:00.711 myapp[376:60b] [DoneViewController] Upload progress - 8%
2014-02-18 19:57:00.711 myapp[376:60b] [DoneViewController] Upload progress - 11%
编辑:在 ios 7.1 中,有时没有延迟。但是,仍有大约 20 秒的延迟。
【问题讨论】:
你一次下载多个文件吗? @Immi 不。在这两种情况下,我都从头开始运行应用程序,以确保没有延迟会话。 你为什么关心延迟? “背景”的意思是“嘿,系统,请在方便的时候自己做这个”。如果你不想那样,就不要那样做。 @matt ya 这也是对的 @matt 我刚买了你的 iOS 7 Programming Fundamentals 书。它消除了我的很多疑问。欣赏你的工作.. 【参考方案1】:虽然 Apple 根本没有记录它,但这就是后台会话的设计方式。当另一个应用程序正在运行时,您根本无法接管网络连接。 iOS/Apple 负责以它认为可以提供最佳用户体验的方式运行您的后台上传/下载。想象一下,作为正在运行的应用程序,在尝试进行基本 HTTP 调用时,网络连接被另一个应用程序阻塞。我已经写了更多关于我的经验以及何时使用此功能的文章。 https://medium.com/@KyleRStewart/zombie-uploads-with-ios-dd3b1f6b66
【讨论】:
这实际上是Apple在方法+[NSURLSessionConfiguration backgroundSessionConfiguration:]
的描述中记录的:“使用此方法返回的配置对象创建的会话称为后台会话。这些会话与其他会话的不同之处在于以下方面:上传后台会话中的下载任务由外部守护程序执行,而不是由应用程序本身执行。因此,即使应用程序暂停、退出或崩溃,传输也会在后台继续。”
最佳答案。看起来在 iOS 8 beta 5 中,他们添加了一种将优先级(NSURLSessionTaskPriorityDefault、NSURLSessionTaskPriorityLow 或 NSURLSessionTaskPriorityHigh)添加到后台配置的方法。 developer.apple.com/library/prerelease/ios/releasenotes/General/…【参考方案2】:
-(NSURLSession *)backgroundSession // For Background Download
static NSURLSession *backgroundSession = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^
NSURLSessionConfiguration *config = [NSURLSessionConfiguration backgroundSessionConfiguration:@"com.shinobicontrols.BackgroundDownload.BackgroundSession"];
backgroundSession = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];
);
return backgroundSession;
更多信息请查看LINK。您可以在这里看到有多种下载方法。我希望你能在这里得到你的解决方案。
【讨论】:
感谢@Immi 的回答!不幸的是,我在提出问题之前已经尝试过,但没有帮助。我什至尝试过使用delegateQueue,但没有任何运气。 @user960112 所以我会建议你。不要在意延迟..因为最终它会开始下载。 感谢您的建议。 :) 这就是我整天拉头发后所采用的解决方案。我发布了这个问题,希望看看是否有人能够让后台 NSURLSession 任务立即启动。这会让我得到我想要的理想用户体验。 对不起@Immi,但你没有回答这个问题。您的回答只是举例说明了如何设置 NSURLSession 后台任务。【参考方案3】:你可以试试这个吗?
config.discretionary = NO;
根据文档,它:
决定是否可以自行安排后台任务 系统的最佳性能。
警告:您只能在应用处于前台时执行此操作。
https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSURLSessionConfiguration_class/Reference/Reference.html#//apple_ref/doc/uid/TP40013440-CH1-SW31
【讨论】:
感谢您的回答!不幸的是,事实并非如此。我把它设置为 NO。以上是关于使用 [NSURLSessionConfiguration backgroundSessionConfiguration] 时有没有办法消除延迟?的主要内容,如果未能解决你的问题,请参考以下文章
在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?
Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)