iOS NSURLSession,如何在 didCompleteWithError 中重试

标签 ios post background nsurlsession

我想在我的服务器上尝试一个 post 调用直到成功,我想每 30 秒尝试一次。

所以我在调用时使用 NSURLSession:

 NSURLSessionDownloadTask *task = [self.session downloadTaskWithRequest:request];
task.taskDescription = [NSString stringWithFormat:@"Downloading file %@", [path lastPathComponent]];
[task resume];

然后如果发生错误(例如没有网络)我有一个错误:

-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error

我的问题是,如果我的应用处于后台,如何在 30 秒内执行相同的调用?

我尝试使用 dispatch、NSThread 和 performSelector,但看起来它在后台不起作用:(

谢谢。

最佳答案

一些观察:

  1. 如果您想要在几秒钟后重试,即使应用程序不再位于前台,您可能只想请求操作系统多一点时间来执行有限长度的任务。参见 Extending Your App's Background Execution Time .如果这样做,您的标准计时器、dispatch_after 或其他任何东西都应该可以正常工作。

    请注意,您只有 30 秒(低于之前 iOS 版本的 3 分钟)来完成此后台任务。话虽如此,我个人怀疑如果用户没有连接,他们很有可能在接下来的 30 秒内也没有连接,所以我不确定这个重试逻辑是否有任何好处如果应用程序未运行。

  2. 顺便说一下,您可以考虑 Reachability,而不是在 30 秒后重试。以便在网络可用时通知您。在网络重新建立之前,没有必要再试一次。

  3. 另一种方法是使用NSURLSessionConfigurationbackgroundSessionConfigurationWithIdentifier。参见 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/

相关文章:

ios - 从 XIB 加载 View 到 ViewController 和 VIewCell

swift - 使用 Swift 将图像上传到服务器时出错

在 Android Studio 中找不到 Java 类

css - 如何不重复 CSS 背景渐变

android - 如何在没有背景的情况下在 GraphView 中绘制图表?

ios - 场景套件。哪条路向上?

objective-c - 调整大小时淡入 UIView 阴影

ios - tableView.cellForRow(在 : indexPath) returns nil?

php - 如何使用 jQuery POST 将变量从 JavaScript 传递到 PHP

CSS 渐变...意见?