如果连接不可用,iOS 服务请求的重试机制

标签 ios iphone

我有一个场景,我需要向服务器发送请求,当我们在请求时有可用的互联网连接时,这是一件更简单的事情。

但我需要以这种方式编写重试机制,如果当前互联网连接不可用,当互联网连接恢复时,我们应该重新向服务器发送请求。 如何在 iOS 中实现与在 android 中相同的效果,这非常简单,并且可以通过不同的方式实现。 iOS 开发的新手,所以任何示例都会有很大帮助。

我正在使用 objective-c

最佳答案

如果您使用 Alamofire然后他们是 RequestRetrier 协议(protocol),它允许您重试网络请求 ( documentation link )

class RetryHandler: RequestAdapter, RequestRetrier {
    public func should(_ manager: SessionManager, retry request: Request, with error: Error, completion: RequestRetryCompletion) {
        if let response = request.task.response as? HTTPURLResponse, response.statusCode == 401 {
            completion(true, 1.0) // retry after 1 second
        } else {
            completion(false, 0.0) // don't retry
        }
    }
}

let sessionManager = SessionManager()
sessionManager.retrier = RetryHandler()

sessionManager.request(urlString).responseJSON { response in
    debugPrint(response)
}

如果您使用的是 URLSession,那么在 iOS 11 中苹果已经添加了 waitsForConnectivity在尝试连接之前等待网络连接可用的标志

let configuration = URLSessionConfiguration.default
configuration.timeoutIntervalForRequest = 120
configuration.timeoutIntervalForResource = 120
if #available(iOS 11, *) {
  configuration.waitsForConnectivity = true
}
let session = URLSession(configuration: configuration)

注意: session 仅在尝试初始连接时等待。如果在建立连接后网络断开,您将通过完成处理程序或 session 委托(delegate)返回错误,与 iOS 10 一样。多长时间取决于资源 timeoutIntervalForResource

或者最后你可以使用 Reachability检测网络变化并再次重试网络请求。

关于如果连接不可用,iOS 服务请求的重试机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49022853/

相关文章:

javascript - 如何在 ionic 中的 app.run() 中包含 HTTP 请求

ios - 以编程方式创建 UIActionSheet 时收到警告

iphone - iOS 的 OTA 分发 — 对 iOS 4 没有影响

ios - numberOfRowsInSection 方法调用了两次

iphone - 视网膜图像的实际像素尺寸 (iOS)

iphone - NSMutableDictionary 导致 EXC_BAD_ACCESS

ios - UIPinchGestureRecognizer 选择器未在 UIImageView 上调用

ios - Swift 4 UICollectionView 检测滚动结束

ios - 设置导航后退按钮和导航 View 堆栈?

按下弹出 View Controller 时,iOS 11 导航栏大标题为黑色