Добавление индикатора выполнения - Swift - PullRequest
2 голосов
/ 09 марта 2019

Я хочу добавить индикатор выполнения в tableViewController.

У меня есть одна функция с именем HelpersFunctions, которая выполняет все вычисления. Функция doCalculation отвечает за расчет.

Итак, я добавляю следующее уведомление к doCalculation следующим образом:

NotificationCenter.default.post(name: .return_progress, object: self)
for i in 1...n1 {
 //Do all the calculation
}

Итак, как только я достигну NotificationCenter.default.post, он перейдет к контроллеру Tableview с именем CreateNewElementVC

Теперь внутри ViewDidLoad я добавил следующую строку:

//progress
NotificationCenter.default.addObserver(self, selector: #selector(showProgress), name: .return_progress, object: nil)

В тот же файл swift я добавил следующее:

let container_elementProperty: ProgressBarView = {
    let view = ProgressBarView()
    view.backgroundColor = UIColor(white: 0, alpha: 0.5)
    view.translatesAutoresizingMaskIntoConstraints = false
    return view
}()

    @objc func showProgress() {
    if(progressCounter > 1.0){timer.invalidate()}
    print("Step 1")
    container_elementProperty.frame = CGRect(x: 100, y: 100, width: 200, height: 200)
    container_elementProperty.backgroundColor = UIColor(white: 0, alpha: 0.5)
    container_elementProperty.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleDismiss)))

    let queue = DispatchQueue(label: "queue1", qos: .userInteractive)
    queue.async {
        print("Step 2")
        self.view.addSubview(self.container_elementProperty)

    }

    //view.addSubview(container_elementProperty)
    print("Step 3")
    container_elementProperty.progress = progressCounter
    progressCounter = progressCounter + progressIncrement

    let x1: Float = Float(start_Counting)
    let x2: Float = Float(End_Counting)

    let xx: Float = x1 / x2 * 100

    print("Start at: \(xx) %)")

}

Итак, сначала я помещаю все необходимые данные в CreateNewElementVC, затем есть кнопка с именем run, чтобы выполнить все вычисления, а затем она переместится на другой TableViewController со всем результатом.

Поэтому, пока я нахожусь внутри функции doCalculation, должен появиться индикатор выполнения.

На самом деле индикатор выполнения container_elementProperty (UIview) появился сразу после завершения расчета, что делает индикатор выполнения бесполезным.

Есть идеи, как сделать так, чтобы вид с именем container_elementProperty UIView был виден?

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

enter image description here

Почему я не могу вывести вид на экран во время вычисления, как вы можете видеть, что шаг 2 выполнялся первым. Предупреждение, связанное с этой проблемой: UIView.addSubview(_:) must be used from main thread only.

Пример проекта можно проверить по этой ссылке на github. Цени любую поддержку.

1 Ответ

2 голосов
/ 15 марта 2019
  • Чтобы смоделировать прогресс, такой как сетевой запрос, вы не можете просто сделать цикл for в главном потоке, вы должны использовать GCD.
  • Для обновления хода выполнения текущего действия используйте Делегирование , а не KVO .
  • Использование глобальных переменных делает ваш код некорректным, избегайте его!

Это рабочая версия вашего кода.

enter image description here

...