Dispatchqueue и SVProgressHUD в быстрый - PullRequest
       50

Dispatchqueue и SVProgressHUD в быстрый

0 голосов
/ 18 сентября 2018

Я разрабатывал приложение, которое анализирует строки текста, и я хочу использовать 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 в цикле без очереди отправки, но затем прогресс прогресса перемещается только после завершения анализа (полный цикл), что является проблемой.

Любая помощь будет принята с благодарностью.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

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

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
   }
}
0 голосов
/ 18 сентября 2018

Используйте приведенное ниже расширение строки для анализа вашей строки.У него есть блок завершения, который будет возвращать прогресс, а также статус завершения.

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)%)")
            }
        }
    }
}
...