как я могу обновлять индикатор выполнения шаг за шагом?

#ios #swift #progress-bar #swift3 #dispatch-async

#iOS #swift #Индикатор выполнения #swift3 #отправка -асинхронная

Вопрос:

у меня есть код, в котором я добавляю одну константу каждую секунду в свой массив, как я могу обновлять индикатор выполнения каждую секунду при изменении массива?

 var array: [Int] = []

override func viewWillAppear(_ animated: Bool) {
        upgradeArray()
    }

    func upgradeArray() {
        for i in 0...10 {
            sleep(1)
            array.append(i)
            print(i)
            let percentProgress = Float(Float(self.array.count)*100.0/10.0)
            progressBar.setProgress(percentProgress, animated: true)
        }

    }
  

Комментарии:

1. мне нужно показать пользователю, как база будет извлекать

Ответ №1:

Используйте таймер. Предполагая, что ваше представление о ходе выполнения равно 0-1 и увеличивается на 0,1 каждую секунду…

 var timer: Timer?
var array = [String]()

func doStuff() {

    timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true, block: { timer in

        self.array.append("foo")

        let change: Float = 0.1
        self.progressView.progress = self.progressView.progress   (change)

        if self.progressView.progress >= 1.0 {
            self.timer?.invalidate()
        }
    })
}
  

Комментарии:

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

2. мне нужно вставить базу JSON из более чем 16000 стрелок в базу CoreData

Ответ №2:

выполнено с помощью DispatchQueue.global (приоритет: .default).асинхронный

 func upgradeArray() {
        for i in 0...10 {
            DispatchQueue.global(priority: .default).async {
                //sleep(1)
                self.array.append(i)
                print(i)
                DispatchQueue.main.async(execute: {
                    let percentProgress = Float(Float(self.array.count)*100.0/10.0)
                    self.progressBar.setProgress(percentProgress, animated: true)
                })
            }
        }

    }
  

Комментарии:

1. может ли мне помочь два целых значения, например, первый массив var: [Int] = [1500] amp; var total = 500, поэтому я хочу, чтобы тип вывода let value = array / total в swift 3.0 использовался вашим методом