Простой индикатор загрузки (Activity Indicator)

Ещё один простой кусочек кода, на этот раз для 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 (иначе я бы не просидел здесь три часа, пытаясь понять, почему крутилка не запускается пока не загрузится информация с сервера).

November 14, 2019