Я пытаюсь показать метку и индикатор при отправке 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-запроса.