如何继续检查我的Swift应用程序是否有互联网连接?

时间:2016-03-04 16:41:39

标签: ios swift alamofire

我正在编写一个简单的应用程序,它从webservice获取数据并将其显示给用户。我有UIViewController标签,我的代码如下:

override func viewDidLoad() {
        super.viewDidLoad()
        activityIndicator.hidesWhenStopped = true
}

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    self.myLabel.text = ""
    activityIndicator.startAnimating()
    Alamofire.request(.GET, "http://mywebservice.com/fetchData")
        .responseJSON { response in

            switch response.result {

            case .Success:
                self.activityIndicator.stopAnimating()

                if let value = response.result.value {
                    let json = JSON(value)
                    print("JSON: \(json)")
                    let numberOfUsers = json["usersNo"]
                    self.myLabel.text = "We found \(numberOfUsers) users in database"

                }

            case .Failure(let error):
                print("SWITCH ERROR")
                print(error)
            }

    }    
}

当用户进入此面板时,他看到活动指示器一直在运行,直到获取数据 - 当它发生时,活动指示器消失,myLabel充满数据。这样可以正常工作,但是当用户短时间没有互联网连接并进入面板时,获取请求将无法返回任何数据,指示器将继续移动。在这种情况下,最好继续检查互联网连接是否存在以及是否可以获取数据。

如何继续检查互联网连接是否处于活动状态? - 如果是 - 隐藏我的活动指示器并显示提取的数据?

2 个答案:

答案 0 :(得分:2)

在请求结束并且 成功或失败之前,您无法知道请求是成功还是失败。如果有,网络交互就结束了。移动stopAnimating:调用,以便无论成功或失败都会发生:

Alamofire.request(.GET, "http://mywebservice.com/fetchData")
    .responseJSON { response in
        self.activityIndicator.stopAnimating()
        switch response.result { // and so on

如果您想尝试尝试再次尝试失败,只需将您的请求抽象到自己的函数中,以便在出现故障时递归调用自身:

func doRequest() {
    activityIndicator.startAnimating()
    Alamofire.request(.GET, "http://mywebservice.com/fetchData")
        .responseJSON { response in
            self.activityIndicator.stopAnimating()
            switch response.result {
            case .Success:
                // whatever
            case .Failure(let error):
                doRequest() // <-- try again
            }
    }    
}

现在从viewWillAppear内调用该功能。我不认为这是一个非常好的策略 - 事实上,我会警告你不要这样做 - 但如果那是你想做的事情,那么就去吧。

答案 1 :(得分:1)

Alamofire已实施Reachablity,请检查https://github.com/Alamofire/Alamofire#network-reachability

有一个重要的注意事项:

  • 请勿使用Reachability确定是否应发送网络请求。
    • 你应该总是发送它。

在您的情况下,保持Activity Indicator旋转的问题是网络问题不是一种好的做法或User Experience

一些建议:

  1. 当请求失败时,先找出错误是什么。如果是网络问题,请让EndUser知道存在网络问题并检查网络设置。
  2. 保存上次请求,以防您在网络恢复时重试。