Инициализация NSAttributedString является сбой приложения - PullRequest
0 голосов
/ 28 декабря 2018

Ниже код падает (не всегда, но редко), несмотря на то, что он находится внутри блока 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()
}

В то время как я читаю документы Apple на NSAttributedString, оно утверждает, что оно должно быть в главном потоке, поэтому я окружаю его Dispatch.main.async блок, но при этом не устанавливаются стили, установленные на NSAttributedString

Ответы [ 3 ]

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

Если вы пытаетесь преобразовать HTML в строку, вы можете использовать расширение для строки, как показано ниже:

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 ?? ""
    }
}
0 голосов
/ 02 сентября 2019

В соответствии с разрешением, предоставленным форумом разработчиков Apple здесь: https://forums.developer.apple.com/thread/115405

К сожалению, это известная ошибка в iOS (р. 23592459), которая может потенциально повлиять на любого, кто создает NSAttributedString изHTML.

Для этого нет хорошего обходного пути, кроме как полностью отказаться от этого API.Мой совет:

Если вы отображаете большие куски сложного HTML, используйте WKWebView.

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

Извините, у меня нет хороших новостей здесь.

Итак, чтобы избежатьв случае сбоя вам, возможно, придется избегать использования NSAttributedString (data: ) самой функции и написать собственный способ анализа html.

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

Обновление интерфейса только в главном потоке.

DispatchQueue.main.async {
    textLabel.attributedText = generateAttribString()
}
...