我正在使用AlamoreFire并在两者的viewDidAppear方法中检查两个应用程序视图控制器中的网络可访问性。但有时当找到网络时,视图控制器集合视图会加载两次。 我猜测也许Reachability应该只放在整个应用程序的一个地方。
当您要检查多个视图控制器时,实现可达性的最佳和最干净的方法是什么? 我想使用AlamoFire的NetworkReachabilityManager。
答案 0 :(得分:1)
通常使用可达性,您可以在屏幕顶部显示某种错误视图,如果后台正在尝试加载,请不要担心。
在viewDidLoad()
中创建容器视图if Reachability.isConnectedToNetwork() == true {
self.errorView.isHidden = true
} else {
self.errorView.isHidden = false
}
这解决了您的问题,并有助于用户体验。
答案 1 :(得分:0)
我的方法如下。为了更直接地回答你的问题,我不会检查连接。
示例:我一直到应用程序第一次网络通话然后打开我的wifi。
问题:我的应用程序失败,即使在应用程序中没有使用任何需要wifi的内容。
我的方法:我可以理解在登录页面上检查网络连接,但除此之外,我会把它放到你的网络中。如果网络呼叫失败,请检查连接,然后告知用户由于服务器或网络而导致呼叫失败。
这就是我用于可达性的方法:
import Foundation
/// This class is designed to check if the network is connected.
open class Reachability {
/// This function will hit two urls that should never be totally down to see if the device is connected
/// If either url connects, this returns true
///
/// - Parameter resultHandler: returns the result of the connection existing as a Bool in a resultHandler
class func isConnectedToNetwork(_ resultHandler: @escaping (_ isTrue: Bool) -> Void) {
let urlA = URL(string: "https://google.com/")
let urlB = URL(string: "https://baidu.com/")
Reachability.fetchURL(urlA!) { isTrue in
if isTrue {
print("NETWORK STATUS: \(isTrue)")
resultHandler(isTrue)
} else {
Reachability.fetchURL(urlB!, resultHandler: resultHandler)
}
}
}
/// Hits a URL in order to see if the device can connect to it
///
/// - Parameters:
/// - url: the url to request
/// - resultHandler: returns whether the url was successfully retrieved or not
class func fetchURL(_ url:URL, resultHandler: @escaping (_ isTrue: Bool) -> Void) {
var request = URLRequest(url: url)
request.httpMethod = "HEAD"
request.cachePolicy = URLRequest.CachePolicy.reloadIgnoringLocalAndRemoteCacheData
request.timeoutInterval = 10.0
let session = URLSession(configuration: .default)
let dataTask = session.dataTask(with: request) { data, response, error in
if let httpResponse = response as? HTTPURLResponse {
if httpResponse.statusCode == 200 {
resultHandler(true)
} else {
resultHandler(false)
}
} else {
resultHandler(false)
}
}
dataTask.resume()
}
}
然后在代码中的任何地方你都可以这样称呼它:
Reachability.isConnectedToNetwork() { isConnected in
if isConnected {
//Do something when connected
} else {
//Do something when not connected
}
}