【问题标题】:Progress Bar on forEach loop in swiftswift中forEach循环的进度条
【发布时间】:2020-05-08 03:43:24
【问题描述】:

如何测量forEach 循环的进度并将其显示在进度条中? 我将旋转垂直图像以使它们水平。每次转换的图片数量都会不同。

这是我正在做的转换图像的工作,我只需要一种向用户显示进度的方法:

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)
    }
}

【问题讨论】:

    标签: swift macos nsimage nsprogressindicator


    【解决方案1】:

    这样做:

    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)
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用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
          }
      }
      

      【讨论】:

        【解决方案3】:

        您可以使用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)
            }
        }
        

        当你的progressView的进度达到最大值时,你可以执行自己的操作

        【讨论】:

        • 不,我使用的是NSProgressIndicator 而不是UIProgressView,在我从forEach 循环返回后,我的进度条会更新。所以我想我需要跳回主线程来更新每个文件的栏?知道该怎么做吗?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-23
        • 1970-01-01
        相关资源
        最近更新 更多