Как загрузить строку html асинхронно в iOS? - PullRequest
0 голосов
/ 22 декабря 2018

Я анализирую строку html в ячейке таблицы.Разбор этой строки вызывает у меня блокировку основного потока и проблемы с производительностью при прокрутке.

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

let queue = DispatchQueue(label: "Test", qos: .userInteractive)
    queue.async {
        let fontModifiedString = NSString(format:"<span style=\"font-family: Helvetica; font-size: 16 \">%@</span>" as NSString, htmlStr)
        let stringWithoutNewLine = fontModifiedString.replacingOccurrences(of: "\n", with: "<br>")
        do {
            let htmlAttrStr = try NSAttributedString(
                data: stringWithoutNewLine.data(using: String.Encoding(rawValue: String.Encoding.unicode.rawValue), allowLossyConversion: true)!,
                options: [NSAttributedString.DocumentReadingOptionKey.documentType:NSAttributedString.DocumentType.html, NSAttributedString.DocumentReadingOptionKey.characterEncoding: String.Encoding.utf8.rawValue],
                documentAttributes: nil)
            print("html string \(htmlStr)")
            let fontAttribute = [.foregroundColor: htmlStringColor] as [NSAttributedStringKey : Any]
            let mutableAttributedString = NSMutableAttributedString(attributedString: htmlAttrStr)
            mutableAttributedString.addAttributes(fontAttribute, range: NSRange(location: 0, length: htmlAttrStr.length))
            DispatchQueue.main.async {
               self.attributedText = mutableAttributedString
            }
        } catch {
            print(error)
        }
    }

Однако я не могу увидеть строку HTML.Он отображает мне нормальный текст.Это повысило производительность, но не отображает html-строку в приложении?

Как отображать html-строку в ячейках таблицы без снижения производительности?

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018

Используйте вашу строку HTML в htmlresponse, который я получаю, а затем используйте функцию ниже, чтобы показать html в необходимом формате.

let htmlResponse:String = "\((Obj.HTMLStr)!)”
let myText = "<span style=\"font-family: Poppins-SemiBold; font-size: 14\">\(htmlResponse)</span>"
self.myView?.lbl_PolicyText.attributedText = self.stringFromHtml(string: myText)
self.myView?.lbl_PolicyText.sizeToFit()

Преобразование HTML в FUNC STRING

// MARK:- HTML TO STRING
func stringFromHtml(string: String) -> NSAttributedString? {
    do {
        let data = string.data(using: String.Encoding.utf8, allowLossyConversion: true)
        if let d = data {
            let str = try NSAttributedString(data: d,
                                             options: [NSAttributedString.DocumentReadingOptionKey.documentType:  NSAttributedString.DocumentType.html],
                                             documentAttributes: nil)
            return str
        }
    } catch {
    }
    return nil
}
0 голосов
/ 22 декабря 2018

Как отобразить строку HTML в ячейках табличного представления без снижения производительности

Похоже, вы пытаетесь сделать это в cellForRowAt.Но в cellForRowAt вы не можете отнимать много времени, так как вы должны немедленно вернуть ячейку.И вы не можете делать ничего асинхронного в cellForRowAt (например, вычисление в фоновом потоке) по той же причине - вы должны немедленно вернуть ячейку, то есть до того, как асинхронное вычисление будет выполнено.

Это действительно просто вариант стандартной проблемы асинхронной выборки изображений для использования в табличном представлении.По сути, вы должны использовать предварительную выборку, чтобы запустить процесс, и чтобы ячейка табличного представления использовала временный заполнитель.Затем вы помещаете данные, когда они будут готовы, не в ячейку, а в модель данных .Затем вы перезагружаете только что готовую строку табличного представления, и на этот раз cellForRowAt находит данные, готовые немедленно в модели, и использует их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...