我正在编写一个简单的应用程序,它从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
充满数据。这样可以正常工作,但是当用户短时间没有互联网连接并进入面板时,获取请求将无法返回任何数据,指示器将继续移动。在这种情况下,最好继续检查互联网连接是否存在以及是否可以获取数据。
如何继续检查互联网连接是否处于活动状态? - 如果是 - 隐藏我的活动指示器并显示提取的数据?
答案 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。
有一个重要的注意事项:
在您的情况下,保持Activity Indicator
旋转的问题是网络问题不是一种好的做法或User Experience
。
一些建议: