2017-01-06 1 views
0

Я использую быстрый 3 для записи приложения iOS. Я пытаюсь написать кучу файлов в цикле и показать прогресс в пользовательском интерфейсе. Цикл идет:Обновить индикатор выполнения при записи файлов swift 3

  1. записи файла
  2. Проверка оставшегося дискового пространства
  3. Update UI и прогресс бар
  4. Loop

UI не обновляется до тех пор, цикл полностью не завершится. Достаточно смешно, я обновляю пользовательский интерфейс с начальными значениями FIRST THING в функции ViewDidAppear, прежде чем цикл начнется и это обновление произойдет даже после завершения цикла. Вот пример кода:

for _ in 0...100000 { 
     let image = UIImage(name: "someimage_\(nameExt!).png") 
     if let data = UIImagePNGRepresentation(image) { 
      let filename = getDocumentsDirectory().appendingPathComponent("myimage_\(nameExt!).png") 
      nameExt! = nameExt! + 1 
      try? data.write(to: filename) 
     } 

      let currentSpace = getSpace() 
      progress?.progress = abs(Float((capacity!-currentSpace)/capacity!)) 
      let progressValue = progress?.progress 
      progressLabel?.text = "\(progressValue! * 100) %" 
      spaceRemaining?.text = "free space: \(currentSpace/1000000) MB" 
      print("free space: \(currentSpace/1000000000) GB") 
      print("\(progressValue! * 100) %") 
      print("----------") 
} 
+2

Обновление пользовательского интерфейса происходит только тогда, когда основному потоку дается время для их обработки. Попробуйте переместить цикл 'for' на фоновый поток и перенаправлять изменения в элементы пользовательского интерфейса обратно на главную. –

ответ

0

UIProgressView «s progress свойство является значение с плавающей точкой между 0 и 1 по умолчанию. Поэтому, если ваш прогресс должен составлять 50%, вам необходимо установить свойство progress равным 0,5.

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

var updatedProgress: Float = 0 
// update progress 

DispatchQueue.main.async { 
    progressView.progress = updatedProgress 
} 
+0

Спасибо за ответ! Я завернул DispatchQueue.main.async {} вокруг строк обновления, и у меня такая же проблема: 'DispatchQueue.main.async { self.progressLabel? .text =" \ (progressValue! * 100)% " self.spaceRemaining? .text =" свободное пространство: \ (currentSpace/1000000) MB " }' –

+0

Вы пробовали распечатать каждое значение? Получаете ли вы значения, которые вы ожидаете? Каковы значения вашего 'progressValue', которые вы умножаете на 100? Какова ценность 'currentSpace'? – naturaln0va

+1

Если весь цикл 'for' уже находится в основном потоке, то просто добавление' DispatchQueue.main.async' для обновления индикатора выполнения ничего не принесет. Это работает только в том случае, если весь цикл 'for' запускается в фоновом потоке. – rmaddy

Смежные вопросы