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

时间:2018-02-28 05:56:32

标签: ios iphone

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

但我需要编写一个重试机制,如果当前互联网连接不可用,并且当互联网连接回来时,我们应该将请求重新发送到服务器。 如何在iOS中实现相同的功能,在Android的情况下非常容易和不同的方式可行。 iOS开发的新手,所以任何一个例子都会有很大的帮助。

我正在使用目标C

2 个答案:

答案 0 :(得分:4)

如果您使用的是Alamofire,那么它们是RequestRetrier协议,可让您重试网络请求(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)

注意:会话仅在尝试初始连接时等待。如果网络在建立连接后丢失,则会通过完成处理程序或会话委托返回错误,就像iOS 10一样。它需要多长时间取决于资源timeoutIntervalForResource

或最后,您可以使用Reachability检测网络更改并再次重试网络请求。

答案 1 :(得分:1)

如果您在自己的应用中使用Alamofire ,则可以执行以下操作:

import Alamofire

let reachabilityManager = NetworkReachabilityManager()
reachabilityManager?.listener = { [weak self] status in
    var isReachable = false
    switch status {
    case .notReachable, .unknown:
        isReachable = false
        break
    case .reachable:
        isReachable = true
        break
    }
    // Notify the rest of the app (perhaps use a Notification)
        }
reachabilityManager?.startListening()

如果您未使用Alamofire ,请使用here检查问题并回答Reachability

Objective-C vs Swift不会有太大的不同,您可以按照完全相同的方法,只需将其转换为Objective-C。