Pet*_*isu 10 cocoa cocoa-touch nsattributedstring nsoperationqueue ios
调用
NSAttributedString * as = [[NSAttributedString alloc] initWithData:[htmlString dataUsingEncoding:NSUTF8StringEncoding] options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: @(NSUTF8StringEncoding)} documentAttributes:nil error:nil];
Run Code Online (Sandbox Code Playgroud)
除主线程外,导致崩溃
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
Run Code Online (Sandbox Code Playgroud)
当我没有指定下面的属性,而不是它的工作原理
NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,
Run Code Online (Sandbox Code Playgroud)
我需要在后台线程上解析字符串,但这使得它不可能:(
也许回答这个问题为时已晚,但可能会帮助其他人。
实际上NSAttributedString和NSHTMLTextDocumentType必须在主队列或全局队列上异步运行。
您可以在后台线程中使用它,但您必须在全局或主队列上分派包含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")
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7809 次 |
| 最近记录: |