- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想在我的服务器上尝试一个 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,但看起来它在后台不起作用:(
谢谢。
最佳答案
一些观察:
如果您想要在几秒钟后重试,即使应用程序不再位于前台,您可能只想请求操作系统多一点时间来执行有限长度的任务。参见 Extending Your App's Background Execution Time .如果这样做,您的标准计时器、dispatch_after
或其他任何东西都应该可以正常工作。
请注意,您只有 30 秒(低于之前 iOS 版本的 3 分钟)来完成此后台任务。话虽如此,我个人怀疑如果用户没有连接,他们很有可能在接下来的 30 秒内也没有连接,所以我不确定这个重试逻辑是否有任何好处如果应用程序未运行。
顺便说一下,您可以考虑 Reachability,而不是在 30 秒后重试。以便在网络可用时通知您。在网络重新建立之前,没有必要再试一次。
另一种方法是使用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/
我正在与 NSURLSession 上传和下载作斗争,如果不是因为例如在发送(上传)100 个文件的背景下,一切似乎都有效: - (void)URLSession:(NSURLSession *)se
在 IOS9 应用程序上工作,该应用程序在作为 NSURLSessionDelegate 的 Controller 中执行后台 URLSession。这是我如何开始的: self.sessio
当我通过按下电源按钮强制我的设备进入休眠模式时,我的后台任务通过调用委托(delegate)方法 didCompleteWithError 停止并出现错误: The operation couldn’
我想在我的服务器上尝试一个 post 调用直到成功,我想每 30 秒尝试一次。 所以我在调用时使用 NSURLSession: NSURLSessionDownloadTask *task = [s
我有一个符合用于下载数据的 NSURLSession 委托(delegate)的类,当完成调用方法 func URLSession(session: NSURLSession, task: NSURL
我有以下 NSURLSession 的实现. NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration default
我想添加一个进度条以准确了解我的视频上传的百分比,但无法调用 didCompleteWithError、didReceive 响应、didSendBodyData bytesSent:Int64、to
场景是在上传过程中多次将app调到后台和前台,调用didCompleteWithError:方法调到前台时error参数为null。概率是 1/3。 由于错误参数没有提供任何信息,我如何找出问题所在。
我所有的网络代码都依赖于 NSURLSession 委托(delegate)方法——而不是完成处理程序。我的数据和下载任务都很好,但我的上传任务从来没有导致URLSession:task:didCom
我是一名优秀的程序员,十分优秀!