我想在我的服务器上尝试一个 post call 直到它成功,我想每 30 秒尝试一次。
所以我在通话中使用 NSURLSession:
NSURLSessionDownloadTask *task = [self.session downloadTaskWithRequest:request];
task.taskDescription = [NSString stringWithFormat"Downloading file %@", [path lastPathComponent]];
[task resume];
然后如果发生错误(例如没有网络)我有一个错误:
-(void)URLSessionNSURLSession *)session taskNSURLSessionTask *)task didCompleteWithErrorNSError *)error
我的问题是如何在 30 秒内执行相同的调用,我的应用会在后台运行吗?
我尝试了调度、NSThread 和 performSelector,但看起来它在后台不起作用
谢谢。
Best Answer-推荐答案 strong>
一些观察:
如果你想在几秒钟后重试,即使应用程序不再在前台,你可能只是想要求操作系统多一点时间来执行有限长度的任务。见 Extending Your App's Background Execution Time .如果您这样做,您的标准计时器 dispatch_after 或其他任何东西都应该可以正常工作。
请注意,您只有 30 秒(低于以前的 iOS 版本中的 3 分钟)来完成此后台任务。话虽如此,我个人怀疑如果用户没有连接,他们很可能在接下来的 30 秒内也没有连接,所以我不确定这个重试逻辑是否有任何好处如果应用没有运行。
顺便说一下,与其在 30 秒内重试,不如考虑 Reachability以便在网络可用时通知您。在网络重新建立之前,再试是没有意义的。
另一种方法是使用NSURLSessionConfiguration 的backgroundSessionConfigurationWithIdentifier 。见 Downloading Content in the Background .如果您这样做,您有超过 3 分钟的时间来完成请求。一旦重新建立连接,它将自动启动。这种技术的缺点是(a)后台 session 不如前台 session 响应速度快; (b) 仅限于 iOS 7 及更高版本; (c) 你必须实现 NSURLSession 的基于委托(delegate)的再现,而不是完成 block 再现,这需要更多的工作。
坦率地说,我通常倾向于采用第三种方法,但每种方法都有其优点。
关于iOS NSURLSession,如何在 didCompleteWithError 中重试,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/31209372/
|