• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

iOS NSURLSession,如何在 didCompleteWithError 中重试

[复制链接]
菜鸟教程小白 发表于 2022-12-12 15:42:44 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我想在我的服务器上尝试一个 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-推荐答案


一些观察:

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

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

  2. 顺便说一下,与其在 30 秒内重试,不如考虑 Reachability以便在网络可用时通知您。在网络重新建立之前,再试是没有意义的。

  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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap