【发布时间】:2018-02-28 05:56:32
【问题描述】:
我有一个场景,我需要向服务器发送请求,当我们在请求时有可用的互联网连接时,这是一件更简单的事情。
但是我需要编写一个重试机制,如果当前互联网连接不可用并且当互联网连接恢复时,我们应该将请求重新发送到服务器。 如何在 iOS 中实现与在 android 中相同的情况非常容易并且可以通过不同的方式实现。 iOS 开发新手,因此任何示例都会有很大帮助。
我正在使用目标 C
【问题讨论】:
我有一个场景,我需要向服务器发送请求,当我们在请求时有可用的互联网连接时,这是一件更简单的事情。
但是我需要编写一个重试机制,如果当前互联网连接不可用并且当互联网连接恢复时,我们应该将请求重新发送到服务器。 如何在 iOS 中实现与在 android 中相同的情况非常容易并且可以通过不同的方式实现。 iOS 开发新手,因此任何示例都会有很大帮助。
我正在使用目标 C
【问题讨论】:
如果您使用的是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 来检测网络变化并重试网络请求。
【讨论】:
如果您在应用中使用 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。
【讨论】: