后台线程中来自HTML的NSAttributedString

时间:2014-02-04 17:14:13

标签: html ios ios7 nsattributedstring

我需要的是从相对较大的HTML字符串创建NSAttributedString个对象并将它们(NSAttributedString-s)存储在数据库中。当然我想在后台主题中做到这一点。

这是一个简单的代码(失败),以展示我正在尝试做的事情:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    NSString *HTMLString = @"<p>HTML string</p>";
    NSDictionary *options = @{NSDocumentTypeDocumentAttribute : NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute : @(NSUTF8StringEncoding)};
    NSError *error = nil;
    NSAttributedString *attributedText = [[NSAttributedString alloc] initWithData:[HTMLString dataUsingEncoding:NSUTF8StringEncoding] options:options documentAttributes:nil error:&error];
});

根据this discussion,可能根本无法在后台线程中执行此操作,因为使用NSAttributedString选项创建NSHTMLTextDocumentType时会使用需要旋转runloop的WebKit同时执行任何异步工作。

但可能是别人想通了吗?我有非常简单的HTML,只有文字和链接,可能有一种方法可以指定从HTML创建NSAttributedString不需要任何“WebKit - 渲染”?

或者可能有人可以推荐第三方lib从不使用NSAttributedString的简单HTML创建WebKit

2 个答案:

答案 0 :(得分:3)

是的,你只能在主线程的后台线程中使用它。 使用Oliver Drobnik的NSAttributedString+HTML课程。

代码就是这样 -

NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithHTML:<html> dataUsingEncoding:NSUTF8StringEncoding] documentAttributes:nil];

链接 - https://github.com/InfiniteLoopDK/NSAttributedString-Additions-for-HTML/blob/master/Classes/NSAttributedString%2BHTML.m

答案 1 :(得分:1)

您可以尝试NSAttributedString+DDHTML。 AFAIK它不依赖于WebKit,我成功地将它用于简单的HTML。我没有尝试在后台线程中使用它,但我想它应该不是问题。

请注意 - 当HTML包含iOS上不可用的字体时,它可能会崩溃。我为此发了pull request