在后台线程中从HTML创建NSAttributedString

8
我需要从相对较大的HTML字符串创建NSAttributedString对象并将它们(NSAttributedString)存储在数据库中。当然,我希望在后台线程中完成此操作。
这是一个简单的代码示例(失败了),演示了我正在尝试做的事情:
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];
});

根据这个讨论,可能根本无法在后台线程中完成,因为使用NSHTMLTextDocumentType选项创建带有NSAttributedStringWebKit需要在执行任何异步工作时旋转运行循环。
但是也许其他人已经找到了方法?我有非常简单的HTML,只有文本和链接,也许有一种方式可以指定从HTML创建NSAttributedString不需要任何"WebKit-rendering"?
或者也许有人可以推荐第三方库来从简单的HTML中创建NSAttributedString而不使用WebKit
2个回答

4

是的,你只能在主线程中完成,无法在后台线程中完成。使用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。这是一个与HTML相关的NSAttributedString扩展,可以将HTML转换成NSAttributedString。

1
你可以尝试使用NSAttributedString+DDHTML。据我所知,它不依赖于WebKit,并且我已经成功地将其用于简单的HTML。我没有尝试在后台线程中使用它,但我认为这应该不是问题。
还要注意 - 当HTML包含iOS上不可用的字体时,它可能会崩溃。我已经发出了pull request来解决这个问题。

2
有人确认它是否在后台线程上工作了吗? - AmitaiB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接