【发布时间】:2020-03-18 07:03:49
【问题描述】:
当我在 API 请求之前调用它时,我的 UIActivityIndicatorView 不显示,并在请求完成后显示,
这是我在按钮的TouchUpInside 内运行的函数
func onLogin () {
let activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView()
activityIndicator.center = view.center
activityIndicator.hidesWhenStopped = true
activityIndicator.style = UIActivityIndicatorView.Style.gray
view.addSubview(activityIndicator)
activityIndicator.startAnimating()
do {
let data = try self.getData()
let loginData = try JSONDecoder().decode(LoginResponse.self, from: data!)
print(loginData)
} catch {
let alert = UIAlertController(title: "Login failed", message: nil, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default))
present(alert, animated: true, completion: nil)
}
}
我的请求代码是
static func getData() throws -> Data? {
let urlData = URL(string: "www.example.com")
var request : URLRequest = URLRequest(url: urlData!)
request.httpMethod = "POST"
request.httpBody = self.getBodyString.data(using: .utf8)
var data: Data?
var response: URLResponse?
var error: Error?
let semaphore = DispatchSemaphore(value: 0)
URLSession.shared.dataTask(with: request) { d,r,e in
data = d
response = r
error = e
semaphore.signal()
}.resume()
_ = semaphore.wait(timeout: .distantFuture)
if error != nil {
throw error!
}
return data
}
当我在 onLogin() 函数中删除 do catch 和 getData() 时,UIActivityIndicatorView 运行良好。
我的 API 调用的响应是请求超时,但我想查看加载请求的指示器。
【问题讨论】:
-
尝试在
DispatchQueue.main.async {}中使用您的活动指示器 -
@EmreDeğirmenci 我没有将 activityIndicator 放在
DispatchQueue.main.async {}中,而是将do {} catch {}用它包裹起来并工作,因为当我用它包裹activityIndicator时,它仍然没有显示, 这样好吗?或者有什么我错过了或者不是一个好的做法? -
我对好的做法一无所知。
标签: swift uiactivityindicatorview