下面的代码尽管崩溃在do-catch
块中,但仍然崩溃(并非总是但很少)。
Fabric crashlytics
指出例外为Fatal Exception: NSInternalInconsistencyException
,有时为EXC_BAD_ACCESS KERN_PROTECTION_FAILURE 0x000000016fccb1f8
do {
return try NSAttributedString(
data: data,
options: [
.documentType: NSAttributedString.DocumentType.html,
.characterEncoding: String.Encoding.utf8.rawValue
],
documentAttributes: nil
)
} catch {
return NSAttributedString()
}
当我阅读NSAttributedString
的苹果文档时,它指出它应该在主线程上,因此我用Dispatch.main.async
块将其包围,但是这样做并没有设置在{{1}上设置的样式}
答案 0 :(得分:2)
根据苹果开发者论坛在此处提供的解决方案:https://forums.developer.apple.com/thread/115405
可悲的是,这是iOS(r。23592459)中的一个已知错误,可能会 影响从HTML构造NSAttributedString的任何人。
除了避免使用此API之外,没有其他解决方法 共。我的建议:
如果要显示大量的复杂HTML,请使用WKWebView。
如果此HTML受到严格限制-也许您只是将HTML用作 一种传输受约束的属性集(如粗体和 斜体-创建您自己的不依赖HTML的标记系统。 或仅解析这些属性的HTML,然后将结果用于 创建您的属性字符串。
很抱歉,我这里没有更好的消息。
因此,为避免崩溃,您可能需要避免使用 NSAttributedString( 数据: 函数本身,并编写自己的方法来解析html。
答案 1 :(得分:1)
仅在主线程中更新UI。
DispatchQueue.main.async {
textLabel.attributedText = generateAttribString()
}
答案 2 :(得分:0)
如果您尝试将HTML转换为String,则可以使用String扩展名,如下所示:
extension String {
var htmlToAttributedString: NSAttributedString? {
do {
return try NSAttributedString(data: Data(utf8),
options: [.documentType: NSAttributedString.DocumentType.html,
.characterEncoding: String.Encoding.utf8.rawValue],
documentAttributes: nil)
} catch {
print("error: ", error)
return nil
}
}
var htmlToString: String {
return htmlToAttributedString?.string ?? ""
}
}