swift 中的 Dispatchqueue 和 SVProgressHUD

Dispatchqueue and SVProgressHUD in swift

我一直在设计一个分析文本行的应用程序,我想使用 SVProgressHUD 来显示它的进度。

这是我的代码:

let total = text.count
for line in text{
    count = count + 1
    DispatchQueue.global(pos: .background).async{
        //Analyzing line
        DispatchQueue.main.async{
            SVProgressHUD.showProgress(count/total)
        }
    }
}

分析成功,HUD正常显示,当count到达total时,进程卡住,SVProgressHUD停在max状态,程序停止。程序有什么问题?

我是不是用错了Dispatchqueue? 我是否必须调用其他东西来释放后台进程或其他东西?

我试过交换//Analyzing lineSVProgressHUD.show...,但还是不行。我最初在没有 dispatchqueue 的循环中使用 SVProgress,但随后进度 hud 仅在分析(完整循环)完成后才移动,这是一个问题。

如有任何帮助,我们将不胜感激。

谢谢。

使用以下字符串扩展来分析您的字符串。它有一个完成块,它将 return 进度以及完成状态。

extension String {
func analyseString(completion: @escaping (Bool, Float) -> ()) {
    let totalCountOfString = self.count
    for (index, _) in self.enumerated() {
        if index == totalCountOfString - 1 {
            completion(true, Float(index)/Float(totalCountOfString))
        } else {
            completion(false, Float(index)/Float(totalCountOfString))
        }
    }
  }
}

您可以调用上述方法来显示您的进度,如下所示(可能是单击按钮)。 self.yourString 是您需要分析的输入字符串。

@IBAction func clicked(_ sender: UIButton) {
    DispatchQueue.main.async {
        self.yourString.analyseString { (isCompleted, progress) in
            if isCompleted {
                SVProgressHUD.dismiss()
                print("Ending")
            } else {
                SVProgressHUD.showProgress(progress, status: "Analysing (\(progress)%)")
            }
        }
    }
}

尝试使用此代码。它不使用循环,而是实现对用于处理字符串数据的函数的递归调用。

func processLines() {
    SVProgressHUD.showProgress(0)

    // sample data
    var text = Array("abcdefghijklmnop")
    var lines : [Line] = []
    let count : [Int] = Array(0..<text.count)
    count.forEach({ pos in lines.append(Line(char: text[pos])) })
    var currentIndex : Int = 0

    func processLine(at index: Int) {

        DispatchQueue.global(qos: .background).async{
            //Analyzing line
            let line = lines[index]
            print("Processing Line CHAR: \(line.char)")

            DispatchQueue.main.async{
                DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
                    guard currentIndex < lines.count-1 else {
                        SVProgressHUD.showProgress(1)
                        return
                    }
                    currentIndex += 1
                    startLineProces(at: currentIndex)
                }
            }
        }

    }

    func startLineProces(at index: Int) {
        processLine(at: index)
        SVProgressHUD.showProgress(Float(index) / Float(lines.count))
    }


    DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
        startLineProces(at: currentIndex)
    }
}

struct Line {
   var char: Character
   init(char: Character) {
     self.char = char
   }
}