繁体   English   中英

UIActivityIndi​​catorView 在 URLSession.shared.dataTask 之前没有显示

[英]UIActivityIndicatorView not showing before the URLSession.shared.dataTask

当我在 API 请求之前调用它时,我的 UIActivityIndi​​catorView 没有显示,并且会在请求完成后显示,

这是我在按钮的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()函数中使用getData()删除do catch ,UIActivityIndi​​catorView 运行良好。

我的 API 调用的响应是请求超时,但我想看到加载请求的指示器。

尝试将活动指示器带到 UIview 的前面并在 DispatchQueue.main.async 中使用它

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM