Как отобразить счетчик в середине работы интерфейса? - PullRequest
1 голос
/ 24 октября 2019

У меня есть следующая функция на iOS, которая выполняет работу с пользовательским интерфейсом над TableView, и проблема в том, что, если она начинает дольше 0,5 сек. пользователь должен отобразить счетчик, чтобы экран не выглядел так, как будто он застыл.

func updateForm(with rowItems: [RowItem]) {

    self.tableView.beginUpdates()   // performance tweak.

    let viewControllerName = String.init(describing: self.classForCoder)    // id
    var defaultSection = Form.createSectionWith(tag: viewControllerName, in: form)

    // MARK: - update rows

    let allRows = self.form.allRows

    let startTime = CFAbsoluteTimeGetCurrent()
    var showSpinner = false

    for (index, item) in rowItems.enumerated() {
        .
        .
        .
        <TableView processing work on 100's of rows>
        .
        .
        .

        // Evaluate our running time for this process loop, and display spinner if we're past a threshold of seconds.
        let timeElapsed = CFAbsoluteTimeGetCurrent() - startTime
        if timeElapsed > 0.5 && showSpinner == false {
            showSpinner = true
            self.showActivityIndicator(withStatus: "processing")    // {NEVER GETS DISPLAYED}
        }

    }  // for (index, item) ...

Конечно, когда я звоню на showActivityIndicator, он никогда не отображается. *

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

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

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

, прежде чем начать обработку данных, создайте таймер сзадержка, при которой спиннер загружается при его запуске

let delayInSeconds = 5.0 
let timer = Timer.scheduledTimer(withTimeInterval: delayInSeconds, repeats: false){
   //closure that loads the spinner view on top of the current view
}

, затем по завершении обработки

timer?.invalidate() //cancels the timer if it hasn't fired

, а затем выгружается представление блесны

0 голосов
/ 24 октября 2019

Вам нужно выйти из основного потока, чтобы цикл цикла запустился и наступил момент перерисовки. Простая задержка после показа счетчика перед тем, как продолжить работу, решит проблему. Но вам придется реорганизовать свой код, чтобы учесть это. Самое простое решение - отказаться от своей 0,5-секундной идеи и просто показать счетчик, прежде чем начинать сначала.

...