ios - 如果不在主线程上,NSAttributedString initWithData 和 NSHTMLTextDocumentType 会崩溃

标签 ios cocoa cocoa-touch nsattributedstring nsoperationqueue

打电话

NSAttributedString * as = [[NSAttributedString alloc] initWithData:[htmlString dataUsingEncoding:NSUTF8StringEncoding] options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: @(NSUTF8StringEncoding)} documentAttributes:nil error:nil];

在非主线程上,导致崩溃

1   0x194b861fc <redacted>
2   0x19801d31c <redacted>
3   0x198010eb4 _os_once
4   0x19801aa2c pthread_once
5   0x195a0858c <redacted>
6   0x195a07c78 WebKitInitialize
7   0x18bb38918 <redacted>
8   0x10020cdf0 _dispatch_client_callout
9   0x10020dcfc dispatch_once_f
10  0x1977f8bd0 <redacted>
11  0x1978009ac <redacted>
12  0x19780bdb8 <redacted>
13  0x1940b259c _NSReadAttributedStringFromURLOrData
14  0x1940b0eb4 <redacted>
15  0x1001041a0 -[MPMPostTextBrickCell attributedTextWithHTMLString:]
16  0x100103d3c __39-[MPMPostTextBrickCell setupWithBrick:]_block_invoke
17  0x187fb3508 <redacted>
18  0x187f04c94 <redacted>
19  0x187ef461c <redacted>
20  0x187fb626c <redacted>
21  0x10020cdf0 _dispatch_client_callout
22  0x100217854 _dispatch_queue_drain
23  0x100210120 _dispatch_queue_invoke
24  0x10021975c _dispatch_root_queue_drain
25  0x10021af18 _dispatch_worker_thread3
26  0x1980192e4 _pthread_wqthread
27  0x198018fa8 start_wqthread

当我不指定下面的属性时,它会起作用

NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,

我需要在后台线程上解析字符串,但这不可能:(

最佳答案

文档对此非常明确。

The HTML importer should not be called from a background thread (that is, the options dictionary includes NSDocumentTypeDocumentAttribute with a value of NSHTMLTextDocumentType). It will try to synchronize with the main thread, fail, and time out. Calling it from the main thread works (but can still time out if the HTML contains references to external resources, which should be avoided at all costs). The HTML import mechanism is meant for implementing something like markdown (that is, text styles, colors, and so on), not for general HTML import.

只能在主线程上使用 HTML 导入器 (NSHTMLTextDocumentType)。

(来源:Apple's documentation)

关于ios - 如果不在主线程上,NSAttributedString initWithData 和 NSHTMLTextDocumentType 会崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28915954/

相关文章:

ios - Mapbox SDK离线 map 下载

ios - 将 NSDictionary 值转换为 NSString

cocoa-touch - 在 Cocoa 和 Cocoa Touch 中将 CGPoint 存储在 NSArray 中的通用解决方案?

iphone - 组合 NSMutableSets 时出现问题

iphone - 获取 iOS 中移动证书中包含的 pfx 文件

iphone - 使用 Core Data 实现枚举的最佳方法

ios - cameraOverlayView 阻止使用 allowEditing 进行编辑

ios - UIStackView 隐藏 View 动画

iphone - UIWeb View : Absolute path for images in app documents folder

iphone - 如何通过parentviewcontroller将数据从一个 View 传递到另一个 View