Обновить UIProgressView из сети

Я использую Xcode 10 и Swift 4.2.

в viewDidload() UIViewController я объявляю наблюдателя:

override func viewDidLoad() {
    super.viewDidLoad()
    NotificationCenter.default.addObserver(self, selector: #selector(OtherFunctionsViewController.dataImportExportFunc), name: .ImportExportdata, object: nil)
} 

Из сети я получаю сообщение (на основе имени .ImportExportdata), которое увеличивает значение с плавающей запятой, называемое ProgressLevel, с 0,0 до 1,0.

Я объявил, что за этим значением будет следовать IOS, и оно работает. Он правильно печатает значение, которое будет обновлено

@IBOutlet weak var OtherFuncProgressView: UIProgressView!
var ProgressLevel : Float = 0.0 {
    willSet // "name" is ABOUT TO CHANGE
    {
        print("ProgressLevel WILL be set...")
        print("from current value: \(ProgressLevel)")
        print("to new value: \(newValue).\n")
        DispatchQueue.global(qos: DispatchQoS.QoSClass.userInteractive).async
            {
                DispatchQueue.main.async
                    {
                        print("dispatch queue main")
                        self.OtherFuncProgressView.setProgress(Float(self.ProgressLevel), animated: true)
                        self.OtherFuncProgressView.setNeedsDisplay()
                }
        }
    }
}

ProgressLevel печатается правильно, но progressView никогда не обновляется на экране.

Что не так?

Спасибо за Ваш ответ

Я изменяю свой код в соответствии с вашим предложением следующим образом:

    var ProgressLevel : Float = 0.0

    {
        willSet // "name" is ABOUT TO CHANGE
        {
            print("ProgressLevel WILL be set...")
            print("from current value: \(ProgressLevel)")
            print("to new value: \(newValue).\n")
//            DispatchQueue.global(qos: DispatchQoS.QoSClass.userInteractive).async
//                {
                    DispatchQueue.main.async
                        {
                            print("dispatch queue main value \(newValue)")
//                            self.OtherFuncProgressView.setProgress(Float(self.ProgressLevel), animated: true)
                            self.OtherFuncProgressView.setProgress(Float(newValue), animated: true)

                            self.OtherFuncProgressView.setNeedsDisplay()
                    }
//            }
        }
}

Я получил: ProcessImportFile: файл:///Users/guydesbief/Library/Developer/CoreSimulator/Devices/17DA59AA-430F-4395-B2F3-FF2A81EEB429/data/Containers/Data/Application/91B3BA10-45C1-4090-A401-5CDA03EED8C8/ tmp/2019-2-21_2018-2-19_Mois.csv 2019-02-21 11:18:22.755903+0100 SolarPanelSurveyIos[85928:4363118] razImport Done ProgressLevel БУДЕТ установлен... от текущего значения: 0,0 до нового значения: 0,0 .

2019-02-21 11:18:22.758389+0100 SolarPanelSurveyIos[85928:4363118] Статистический файл WindowController Stream OK основное значение очереди отправки 0.0 21.02.2019 11:18:22.760800+0100 SolarPanelSurveyIos[85928:4363118] Statistic WindowController Данные больше не считываются из файла! 2019-02-21 11:18:22.761242+0100 SolarPanelSurveyIos[85928:4363118] Заголовок поля: Запись импорта завершена с помощью char Nbfields = 4 , Текущая запись: 0 4363118] Импорт завершен 40 записей, 38 максимальных записей

ProgressLevel БУДЕТ установлен... от текущего значения: 0,0 до нового значения: 0,05263158.

ProgressLevel БУДЕТ установлен... с текущего значения: 0,05263158 на новое значение: 0,13157895.

ProgressLevel БУДЕТ установлен... с текущего значения: 0,13157895 на новое значение: 0,21052632.

ProgressLevel БУДЕТ установлен... с текущего значения: 0,21052632 на новое значение: 0,28947368.

ProgressLevel БУДЕТ установлен... с текущего значения: 0,28947368 на новое значение: 0,36842105.

ProgressLevel БУДЕТ установлен... с текущего значения: 0,36842105 на новое значение: 0,4473684.

ProgressLevel БУДЕТ установлен... с текущего значения: 0,4473684 на новое значение: 0,5263158.

ProgressLevel БУДЕТ установлен... с текущего значения: 0,5263158 на новое значение: 0,6052632.

ProgressLevel БУДЕТ установлен... от текущего значения: 0,6052632 до нового значения: 0,68421054.

ProgressLevel БУДЕТ установлен... с текущего значения: 0,68421054 на новое значение: 0,7631579.

ProgressLevel БУДЕТ установлен... с текущего значения: 0,7631579 на новое значение: 0,84210527.

ProgressLevel БУДЕТ установлен... от текущего значения: 0,84210527 до нового значения: 0,92105263.

ProgressLevel БУДЕТ установлен... от текущего значения: 0,92105263 до нового значения: 1,0.

2019-02-21 11:18:23.631275+0100 SolarPanelSurveyIos[85928:4363118] Темп выполнения: 871867

dataImportExportFunc Нет больше данных количество записей: 0 / 39.000000 execTime: 0.8719

основное значение очереди отправки 0,05263158

основное значение очереди отправки 0,13157895

основное значение очереди отправки 0,21052632

основное значение очереди отправки 0,28947368

основное значение очереди отправки 0,36842105

основное значение очереди отправки 0,4473684

основное значение очереди отправки 0,5263158

основное значение очереди отправки 0,6052632

основное значение очереди отправки 0,68421054

основное значение очереди отправки 0,7631579

основное значение очереди отправки 0,84210527

основное значение очереди отправки 0,92105263

основное значение очереди отправки 1.0

Очередь отправки очищается только в конце процесса, и я хотел бы очистить ее в режиме реального времени Любые предложения приветствуются


person La Ciste    schedule 20.02.2019    source источник
comment
Попробуйте просто использовать DispatchQueue.main.async вместо того, чтобы вкладывать его внутрь DispatchQueue.global(qos: DispatchQoS.QoSClass.userInteractive).async   -  person Shamas S    schedule 20.02.2019
comment
вообще, зачем тебе эта строка self.OtherFuncProgressView.setNeedsDisplay()?   -  person holex    schedule 21.02.2019


Ответы (1)


willSet вызывается перед обновлением значения, поэтому лучше использовать newValue внутри замыкания:

var progressLevel: Float = 0.0 {
    // "name" is ABOUT TO CHANGE
    willSet {
        print("ProgressLevel WILL be set...")
        print("from current value: \(progressLevel)")
        print("to new value: \(newValue).\n")
        DispatchQueue.main.async {
            print("dispatch queue main")
            self.OtherFuncProgressView.setProgress(Float(newValue, animated: true)
            self.OtherFuncProgressView.setNeedsDisplay()
        }
    }
}
person pckill    schedule 20.02.2019