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

November 14, 2019

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