Как показать индикатор при выполнении HTTP-запроса в swift - PullRequest
0 голосов
/ 26 декабря 2018

Я пытаюсь показать метку и индикатор при отправке HTTP-запроса в быстром режиме, но действие над меткой и индикатором всегда выполняется после завершения HTTP-запроса.

Таким образом, индикатор и метка отображаются после завершения всего httpRequest, непосредственно перед выполнением segue.Это видно за миллисекунды, а не за время ожидания.

Вот код.При нажатой кнопке я хочу показать индикатор и метку, которые по умолчанию скрыты, а затем вызвать HTTP-запрос.

class NewVisitViewController: UIViewController, DownloadInfoProtocol {
let dispatchGroupController : DispatchGroup = DispatchGroup()

@IBOutlet var downloadSpinner: UIActivityIndicatorView!
@IBOutlet var downloadLabel: UILabel!
@IBAction func showAllNewVisits(_ sender: UIButton) {
    showDownloadInfo()

    let dataBaseManager = DataBaseManager()
    availableVistis = dataBaseManager.getAllFreeVisits()

    performSegue(withIdentifier: "showAllVisitsSeque", sender: self)
}

override func viewDidLoad() {
    super.viewDidLoad()
    hideDownloadInfo()
}

func hideDownloadInfo(){
    self.downloadLabel.isHidden = true
    self.downloadSpinner.isHidden = true
}

func showDownloadInfo(){
    self.downloadLabel.isHidden = false
    self.downloadSpinner.isHidden = false
}

И код в dataBaseManager, который фактически выполняет HTTP-запрос:

func getAllFreeVisits() -> [Visit] {
    print("getAllFreeVisits")
    let params: NSDictionary = [
        "entity" : "getAllFreeVisits"
    ]
    return getVisitsWithGivenParams(params: params)
}


func getVisitsWithGivenParams(params: NSDictionary) -> [Visit]  {

    print("getWithParams")
    dispatchGroup.enter()
    var vistis : [Visit] = []

    let finalURL = appendQueryParams(params: params)
    guard let url = URL(string: finalURL) else {
        print ("error while creationg URL")
        return vistis
    }

    let urlRequest = URLRequest(url: url)

    let task = session.dataTask(with: urlRequest, completionHandler:
    {
        (data, response, error) in
        let jsonData = Data(String(data: data!, encoding: String.Encoding.utf8)!.utf8)

        do {
            vistis = try self.decoder.decode([Visit].self, from: jsonData) 
        } catch {
            print(error.localizedDescription)
        }
        self.dispatchGroup.leave()
    })
    task.resume()

    dispatchGroup.wait()
    return vistis
}

Я предполагаю, что это что-то с многопоточностью, но я не представляю, что нужно изменить здесь, чтобы показать индикатор и метку перед началом вызова HTTP-запроса.

1 Ответ

0 голосов
/ 26 декабря 2018

Используйте обработчик completion, чтобы узнать, когда запрос http завершен.Затем вы можете скрыть индикатор активности и метку, а также выполнить segue.

Вы должны обновить метод getVisitsWithGivenParams, как показано ниже,

func getVisitsWithGivenParams(params: [String: Any], completion: @escaping (([Visit], Error?) -> Void)) {

    let finalURL = appendQueryParams(params: params)
    guard let url = URL(string: finalURL) else {
        print ("error while creationg URL")
        completion(nil, NSError()) 
        return
    }

    let urlRequest = URLRequest(url: url)

    let task = session.dataTask(with: urlRequest, completionHandler:
    {
        (data, response, error) in
        let jsonData = Data(String(data: data!, encoding: String.Encoding.utf8)!.utf8)

        do {
            let vistis = try self.decoder.decode([Visit].self, from: jsonData)
            completion(visits, nil) 
        } catch {
            print(error.localizedDescription)
            completion(nil, error) 
        }
    })
    task.resume()
}

Теперь вы можете использовать это, как показано ниже,

@IBAction func showAllNewVisits(_ sender: UIButton) {
    showDownloadInfo()

    let params: [String: Any] = ["entity" : "getAllFreeVisits"]
    let dataBaseManager = DataBaseManager()
    dataBaseManager.getVisitsWithGivenParams(params: params) { (visits, error) in
        self.hideDownloadInfo()

        if let error = error {
            print(error)
            return
        }
        self.availableVistis = visits
        self.performSegue(withIdentifier: "showAllVisitsSeque", sender: self)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...