NS在没有挂起UI线程的情况下从html派生字符串

时间:2016-10-03 21:40:11

标签: html swift grand-central-dispatch nsattributedstring

我正在尝试将一些html文本加载到NSAttributedString中,我看到UI挂起。

环顾四周我不确定这是否可行,因为它可能必须在主线程上运行:NSAttributedString from HTML in the background thread

在swift 3 iOS 10中,我能够毫无例外地运行

let myString = // some html content
DispatchQueue.global(qos: .background).async { 
    let data = myString.data(using: .utf8)
    let options: [String: Any] = [
        NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType,
        NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue
    ]

    do {
        let attributedString = try NSAttributedString(data: data!, options: options, documentAttributes: nil)

        DispatchQueue.main.async {
            () -> Void in
            self.label.attributedText = attributedString
        }
    } catch let error as NSError {
        print(error.localizedDescription)
    }
}

一些事情。

  1. 不确定为什么它不会崩溃。但是我怀疑它仍然在主线程上运行,因为UI仍然会锁定几秒钟。

  2. html中有图片。想知道是否是造成大部分延误的原因。我仍然希望显示图像,但想知道我是否可以将它们拉出来,只是最初显示文本并在后台线程上加载图像。不确定NSAttributedString内置了什么内容来提取图像,或者我必须手动解析它们。

  3. 有什么方法可以在后台线程上加载这些数据,所以在使用用html数据初始化的NSAttributedString时我无法锁定UI?

1 个答案:

答案 0 :(得分:0)

碰到同样的情况,我只是想知道“超时”键的设置值可以减少无响应时间。

var options = [NSAttributedString.DocumentReadingOptionKey : Any]()
options[.documentType] = NSAttributedString.DocumentType.html
options[.characterEncoding] = String.Encoding.utf8.rawValue
options[.timeout] = 5.0 //Important!You can adjust this value to suitable value.

我认为下面的代码总是在主队列中运行,使用该功能无法避免UI完全挂起。

NSAttributedString(data: data!, options: options, documentAttributes: nil)