如果不在主线程上,NSAttributedString initWithData 和 NSHTMLTextDocumentType 会崩溃
NSAttributedString initWithData and NSHTMLTextDocumentType crash if not on main thread
打电话
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
)。
也许现在回答这个问题来不及了,但可能会对其他人有所帮助。
实际上 NSAttributedString 和 NSHTMLTextDocumentType 必须 运行 asynchronously 在主队列上或全局队列。
您可以在后台线程中使用它,但您必须在全局或主队列上分派包含 NSAttributedString 初始化程序的代码块。例如:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { () -> Void in
print("Started on \(NSThread.currentThread())")
let encodedData = "<font color=\"red\">Hello</font>".dataUsingEncoding(NSUTF8StringEncoding)!
let attributedOptions : [String: AnyObject] = [
NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,
NSCharacterEncodingDocumentAttribute: NSUTF8StringEncoding
]
let attributedString = (try? NSAttributedString(data: encodedData, options: attributedOptions, documentAttributes: nil) ?? NSAttributedString(string: ""))
print("Finished")
}
打电话
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
)。
也许现在回答这个问题来不及了,但可能会对其他人有所帮助。
实际上 NSAttributedString 和 NSHTMLTextDocumentType 必须 运行 asynchronously 在主队列上或全局队列。
您可以在后台线程中使用它,但您必须在全局或主队列上分派包含 NSAttributedString 初始化程序的代码块。例如:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { () -> Void in
print("Started on \(NSThread.currentThread())")
let encodedData = "<font color=\"red\">Hello</font>".dataUsingEncoding(NSUTF8StringEncoding)!
let attributedOptions : [String: AnyObject] = [
NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,
NSCharacterEncodingDocumentAttribute: NSUTF8StringEncoding
]
let attributedString = (try? NSAttributedString(data: encodedData, options: attributedOptions, documentAttributes: nil) ?? NSAttributedString(string: ""))
print("Finished")
}