твос |swift 4 - Индикатор активности не отображается во время работы функции http-запроса - PullRequest
0 голосов
/ 26 декабря 2018

У меня 2 ВК (основной и серверный).На главной у меня есть действие кнопки, которое откроет вид на сервер.В представлении сервера у меня есть входы для адреса сервера и логина.Я собираюсь получить идентификатор сеанса с сервера и вызвать 2-ю функцию, чтобы выполнить вход с использованием идентификатора сеанса.В случае неправильного адреса или высокой задержки я хочу показать индикатор активности при выполнении http-запроса.Проблема в том, что индикатор не отображается.Он вызывается и работает просто не видно.Я перепробовал все возможные решения, которые я нашел на stackoverflow.Что я заметил, так это то, что когда я нажимаю кнопку «Меню» на пульте дистанционного управления (после истечения времени ожидания сервера), я не перехожу на главный экран, а вместо этого отображает индикатор работающей активности.И еще одна вещь, я использую DispatchSemaphore внутри функций http-запроса, потому что мне нужен идентификатор сеанса с сервера, прежде чем будет выполнена 2-я часть (которая использует идентификатор сеанса).Является ли DispatchSemaphore причиной здесь?

SpinnerViewController:

        import UIKit

    class SpinnerViewController: UIViewController {
        var spinner = UIActivityIndicatorView(style: .whiteLarge)

        override func loadView() {
            view = UIView()
            view.backgroundColor = UIColor(white: 0, alpha: 0.7)

            spinner.translatesAutoresizingMaskIntoConstraints = false
            spinner.startAnimating()
            view.addSubview(spinner)

            spinner.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
            spinner.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
        }
    }

Функция для http-запроса выглядит следующим образом:

    func ServerLoginPullInfo() -> Bool {

        addChild(child)
        child.view.frame = view.frame
        view.addSubview(child.view)
        child.didMove(toParent: self)

        var errorDetected = false
        let sem = DispatchSemaphore(value: 0)

//...http request / response code here

            sem.wait()
            if errorDetected == true {

               print("ERRRRRRRRRRRRRRRROR")

                return false
            } else {ServerLoginSessionID()}

            child.willMove(toParent: nil)
            child.view.removeFromSuperview()
            child.removeFromParent()

            return true
        }

Я также попытался просто позвонить в начале функции http-запроса.

activityIndicator.startAnimating ()

с индикатором, установленным на animating = false и hideswhenstopped = true и hidden = true.

Какие бы варианты я ни пробовал, он работает, но не виден икаким-то образом в качестве представления, к которому я затем смогу получить доступ с помощью кнопки «Меню» на пульте дистанционного управления, что также не так.

Любая идея, что не так?

...