检查viewDidAppear或AppDelegate中的可达性?

时间:2017-03-14 19:19:44

标签: swift alamofire

我正在使用AlamoreFire并在两者的viewDidAppear方法中检查两个应用程序视图控制器中的网络可访问性。但有时当找到网络时,视图控制器集合视图会加载两次。 我猜测也许Reachability应该只放在整个应用程序的一个地方。

当您要检查多个视图控制器时,实现可达性的最佳和最干净的方法是什么? 我想使用AlamoFire的NetworkReachabilityManager。

2 个答案:

答案 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
    }
}