我一直在设计一个分析文本行的应用程序,我想使用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停止在最大状态,程序停止。该程序有什么问题?
我使用Dispatchqueue错误吗? 我是否需要调用其他东西来释放后台进程或其他东西?
我尝试过交换//Analyzing line
和SVProgressHUD.show...
,但是仍然无法正常工作。我最初在没有调度队列的情况下在循环内使用SVProgress,但是随后进度hud仅在分析(完整循环)完成后才移动,这是一个问题。
任何帮助将不胜感激。
谢谢。
答案 0 :(得分:1)
使用以下字符串扩展名分析您的字符串。它有一个完成块,它将返回进度以及完成状态。
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)%)")
}
}
}
}
答案 1 :(得分:1)
尝试使用此代码。它不使用循环,而是实现对函数的递归调用,以处理您的字符串数据。
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
}
}