UIActivityIndicatorView не отображается перед URLSession.shared.dataTask - PullRequest
0 голосов
/ 18 марта 2020

Мой UIActivityIndicatorView не отображается, когда я вызываю его перед запросом API, и будет отображаться после того, как запрос был выполнен,

Это моя функция, которая запускается внутри 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
}

, когда я удаляю do catch с getData() в моей функции onLogin(), UIActivityIndicatorView работал хорошо.

ответ на мой вызов API был тайм-аут запроса, но я хочу видеть индикатор загрузки запроса.

1 Ответ

0 голосов
/ 18 марта 2020

Попробуйте вывести индикатор активности на передний план UIview и использовать его в DispatchQueue.main.asyn c

...