线程安全归因字符串高度计算

时间:2015-01-13 04:12:33

标签: ios thread-safety uikit

如何以线程安全的方式计算属性字符串的高度?我正在为可能非常复杂的布局预先计算单元格高度,并且在执行计算时不想阻止主线程。这就是我正在做的事情(简化了可读性):

// 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();
            }

        });
    });
}

1 个答案:

答案 0 :(得分:1)

Apple does not recommend从主线程调用上述方法,解释如下:

  

不应该从后台线程调用HTML导入器(那个   是,选项字典包括NSDocumentTypeDocumentAttribute   值为NSHTMLTextDocumentType)。它会尝试同步   主线程,失败和超时。从主要呼叫它   线程工作(但如果HTML包含引用,仍然可以超时)   外部资源,应不惜一切代价避免)。 HTML   导入机制用于实现降价等功能   (即文本样式,颜色等),不适用于一般HTML   导入。

如果有人知道任何其他方法来处理确定背景线程的高度,我还是会张开耳朵!