iOS NSURLSession,如何在didCompleteWithError中重试

时间:2015-07-03 14:40:01

标签: ios post background nsurlsession

我想在我的服务器上尝试一个帖子,直到成功,我想每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 个答案:

答案 0 :(得分:2)

一些观察结果:

  1. 如果您想在30秒内再次尝试,即使应用程序不再位于前台,您可能只想让操作系统多花些时间来执行有限长度的任务。见Executing Finite-Length Tasks。如果你这样做,你的标准计时器,dispatch_after或其他什么,应该可以正常工作。

    请注意,您只需3分钟即可完成此后台任务。我知道你说你会倾向于在30秒内再试一次,但我个人怀疑,如果用户没有连接,那么他们很可能在接下来的几个内没有连接分钟,或者。

  2. 顺便说一句,如果在应用程序仍在运行时重试,我可能会建议您在30秒内再次尝试。在我看来,更好的是使用Reachability,以便在网络可用时通知您。在重新建立网络之前再次尝试是没有意义的。

  3. 另一种方法是使用backgroundSessionConfigurationWithIdentifier的{​​{1}}。见Downloading Content in the Background。如果您这样做,您有超过3分钟的时间来完成请求。并且一旦重新建立连接,它将自动启动。这种技术的缺点是(a)后台会话不像前台会话那样响应; (b)仅限于iOS 7及更高版本; (c)你必须实施基于代表的NSURLSessionConfiguration再现,而不是完成块再现,这是一个更多的工作。

  4. 坦率地说,我一般倾向于采用第三种方法,但每种方法都有其优点。