如何最小化html到NSAttributedString的时间转换

时间:2016-11-21 09:03:50

标签: ios swift swift3 nsattributedstring

您好我使用以下代码将html转换为NSAttributtedString。我的问题是我第一次执行它需要很长时间:

var html = "<b>Whatever...</b>"    
var attributedText = try! NSMutableAttributedString(
        data: html.data(using: String.Encoding.unicode, allowLossyConversion: true)!,
        options: [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
        documentAttributes: nil)

当我第一次执行转换时,执行需要很长时间。随后的执行花费的时间更少。有什么方法可以减少这个漫长的首次执行? 我想在应用程序执行开始时在后台执行此代码,但我想知道是否还有其他智能解决方案或库,我应该导入。

2 个答案:

答案 0 :(得分:0)

  

使用“String.Encoding.utf8”而不是“String.Encoding.unicode”   这可能会缩短您的转换时间

var html = "<bold>Wow!</bold> Now <em>iOS</em> can create <h3>NSAttributedString</h3> from HTMLs!"

let attributedOptions: [String: Any] = [
                    NSDocumentTypeDocumentAttribute : NSHTMLTextDocumentType,
                    NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue
                ]

var attrString = try! NSAttributedString(data: html.data(using: String.Encoding.utf8)!, options: attributedOptions, documentAttributes: nil)
YOUR_TEXT_VIEW.attributedText = attrString

答案 1 :(得分:0)

我没有找到任何方法来缩短转换时间。但是有一种方法可以“破解”负载时间。

似乎转换过程在第一次调用时需要很长时间,但在下次调用时会减少。通过这种方式,我解决了在我的AppDelegate中加载一段“html垃圾邮件”的问题。因此,在使用应用程序期间,用户不会注意到缓慢加载。

<强>的AppDelegate:

override func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {

    super.application(application, willFinishLaunchingWithOptions: launchOptions)
    try! NSMutableAttributedString(
        data: "<a>asdasd</a>".data(using: String.Encoding.unicode, allowLossyConversion: true)!,
        options: [
            NSDocumentTypeDocumentAttribute : NSHTMLTextDocumentType,
            NSCharacterEncodingDocumentAttribute: String.Encoding.unicode.rawValue
        ],
        documentAttributes: nil)

    return true
}

在ViewControllers中,您可以正常调用:

var html = "<b>Whatever...</b>"    
var attributedText = try! NSMutableAttributedString(
    data: html.data(using: String.Encoding.unicode, allowLossyConversion: true)!,
    options: [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
    documentAttributes: nil)