【问题标题】:iOS Retry mechanism for a service request if connection not available如果连接不可用,iOS 服务请求的重试机制
【发布时间】:2018-02-28 05:56:32
【问题描述】:

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

但是我需要编写一个重试机制,如果当前互联网连接不可用并且当互联网连接恢复时,我们应该将请求重新发送到服务器。 如何在 iOS 中实现与在 android 中相同的情况非常容易并且可以通过不同的方式实现。 iOS 开发新手,因此任何示例都会有很大帮助。

我正在使用目标 C

【问题讨论】:

    标签: ios iphone


    【解决方案1】:

    如果您使用的是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 来检测网络变化并重试网络请求。

    【讨论】:

    • 如果我使用的是 URLSession,我怎么知道连接何时可用?
    【解决方案2】:

    如果您在应用中使用 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 on using Reachability

    Objective-C 与 Swift 并没有太大的不同,你可以采用完全相同的方法,只需将其转换为 Objective-C。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 2017-05-17
      • 2015-05-08
      • 1970-01-01
      • 2020-03-06
      • 2016-01-12
      • 1970-01-01
      相关资源
      最近更新 更多