Ещё один простой кусочек кода, на этот раз для UI-элемента, сообщающего нам об ожидании.
import UIKit
class ActivityIndicator: UIView {
var spinner: UIView?
func showLoading(onView: UIView) {
let spinnerView = UIView(frame: onView.bounds)
spinnerView.backgroundColor = .gray
spinnerView.backgroundColor = spinnerView.backgroundColor?.withAlphaComponent(0.1)
let ai = UIActivityIndicatorView(style: .white)
ai.startAnimating()
ai.center = spinnerView.center
DispatchQueue.main.async {
spinnerView.addSubview(ai)
onView.addSubview(spinnerView)
}
spinner = spinnerView
}
func hideLoading() {
DispatchQueue.main.async {
self.spinner?.removeFromSuperview()
self.spinner = nil
}
}
}
Таким образом, вызывая showLoading()
, запустим крутящийся элемент "загрузки", а hideLoading()
его спрячет.
Главное - не забыть, что showLoading()
, как метод, относящийся к UI, должен работать в главном потоке, пока метод, результат которого мы ждём (например, загрузка информации с сервера), работает в фоне.
Многопоточность - важная часть разработки на Swift (иначе я бы не просидел здесь три часа, пытаясь понять, почему крутилка не запускается пока не загрузится информация с сервера).