我正在尝试将一些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)
}
}
一些事情。
不确定为什么它不会崩溃。但是我怀疑它仍然在主线程上运行,因为UI仍然会锁定几秒钟。
html中有图片。想知道是否是造成大部分延误的原因。我仍然希望显示图像,但想知道我是否可以将它们拉出来,只是最初显示文本并在后台线程上加载图像。不确定NSAttributedString内置了什么内容来提取图像,或者我必须手动解析它们。
有什么方法可以在后台线程上加载这些数据,所以在使用用html数据初始化的NSAttributedString时我无法锁定UI?
答案 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)