Прогресс-бар на forEach l oop в быстром - PullRequest
0 голосов
/ 22 января 2020

Как бы я измерил прогресс forEach l oop и отобразил бы его в индикаторе выполнения? Я буду вращать вертикальные изображения, чтобы сделать их горизонтальными. Количество конвертируемых изображений будет отличаться каждый раз.

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

func rotateandSave(files: [URL]) {
    files.forEach { file in
        let path = file
        let image = NSImage(contentsOf: path)
        let rotatedImage = image?.rotated(by: rotateAngle)
        saveImage(image: rotatedImage!, destination: path)
    }
}

Ответы [ 3 ]

0 голосов
/ 22 января 2020

Вы можете использовать ProgressView для отображения индикатора выполнения. Вы можете добавить его к своему контроллеру следующим образом:

@IBOutlet weak var progressView: UIProgressView!
override func viewDidLoad() {
        super.viewDidLoad()
        progressView.progress = 0.0
} 

func rotateandSave(files: [URL]) {

    var numberOfFile = files.count
    var fileCounter = 0
    files.forEach { file in
        let path = file
        let image = NSImage(contentsOf: path)
        let rotatedImage = image?.rotated(by: rotateAngle)
        saveImage(image: rotatedImage!, destination: path)
        fileCounter + =1
        let progress = (Double(fileCounter)/Double(numberOfFile))
        progressView.setProgress(progress, animated: true)
    }
}

когда прогресс прогресса вашего ViewView достигнет максимума, вы можете выполнить собственное действие

0 голосов
/ 22 января 2020

Сделайте это:

func rotateandSave(files: [URL]) {
DispatchQueue.global(qos: .utility).async {
    files.forEach { file in
        let path = file
        let image = NSImage(contentsOf: path)
        let rotatedImage = image?.imageRotated(by: 90)
        saveImage(image: rotatedImage!, destination: path)
        DispatchQueue.main.async {
            self.progressBar.increment(by: 1)
        }
    }
}
0 голосов
/ 22 января 2020

Вы можете использовать ProgressView для простого индикатора выполнения. Вы добавляете его в контроллер представления, как и любое другое представление (как слабая переменная @IBOutlet). В viewDidLoad () установите прогресс равным 0, чтобы полоса начала пустой.

Прогресс ProgressView установлен в диапазоне 0,0-1,0 с возможностью анимирования (я полагаю, вы этого хотите). Чтобы обновить ProgressView, вы можете изменить существующую функцию:

@IBOutlet weak var progressView: UIProgressView!
...    
func rotateandSave(files: [URL]) {
    let numFiles = files.count
    let fileNum = 0
    files.forEach { file in
        let path = file
        let image = NSImage(contentsOf: path)
        let rotatedImage = image?.rotated(by: rotateAngle)
        saveImage(image: rotatedImage!, destination: path)
        progressBar.setProgress(Double(fileNum)/Double(numFiles), true)
        fileNum += 1
    }
}
...