如何以线程安全的方式计算属性字符串的高度?我正在为可能非常复杂的布局预先计算单元格高度,并且在执行计算时不想阻止主线程。这就是我正在做的事情(简化了可读性):
// pre-calculate layout information
- (void)performHeightCalculations:(MFBlock)completion {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
// ...
NSDictionary *options = @{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,
NSCharacterEncodingDocumentAttribute: @(NSUTF8StringEncoding)};
// Height calculation for attributed string
// Crash: EXC_BAD_ACCESS 0xbadbeef
label.attributedText = [[NSAttributedString alloc]
initWithData:HTMLString dataUsingEncoding:NSUTF8StringEncoding]
options:options
documentAttributes:nil
error: &err];
height += [label sizeThatFits:CGSizeMake(contentWidth, CGFLOAT_MAX)].height;
// ...
dispatch_async(dispatch_get_main_queue(), ^{
if (completion) {
completion();
}
});
});
}
答案 0 :(得分:1)
Apple does not recommend从主线程调用上述方法,解释如下:
不应该从后台线程调用HTML导入器(那个 是,选项字典包括NSDocumentTypeDocumentAttribute 值为NSHTMLTextDocumentType)。它会尝试同步 主线程,失败和超时。从主要呼叫它 线程工作(但如果HTML包含引用,仍然可以超时) 外部资源,应不惜一切代价避免)。 HTML 导入机制用于实现降价等功能 (即文本样式,颜色等),不适用于一般HTML 导入。
如果有人知道任何其他方法来处理确定背景线程的高度,我还是会张开耳朵!