如何从另一个线程栅格化视图?

时间:2015-03-10 22:03:36

标签: ios objective-c multithreading cocoa-touch

我正在将视图转换为位图图像。这称为光栅化。我试图将光栅化卸载到另一个线程,因此我的UI在光栅化期间不会在一瞬间冻结。令我懊恼的是,尝试这样做恰恰相反:它会永久冻结整个应用程序。活动指示灯停止旋转,按钮停止响应水龙头等......

- (void)setContainerView:(UIView*)containerView
{        
    dispatch_async(
        dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),
        ^{
            UIImage* hugeImage = containerView.rasterizedImage;
            dispatch_async(
                dispatch_get_main_queue(), 
                ^ {
                    self.someImageView.image = hugeImage;
                }
            );
        }
    );
}

rasterize函数在UIView类别中定义:

- (UIImage*)rasterizedImage
{
    UIGraphicsBeginImageContextWithOptions(self.bounds.size, self.opaque, 0.0);
    [self drawViewHierarchyInRect:self.bounds afterScreenUpdates:YES];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

此函数在主线程上运行正常。为什么在另一个线程上运行时会冻结UI?

1 个答案:

答案 0 :(得分:0)

几乎所有UIKit对象都不是线程安全的。您可以在单独的线程中运行它们,而不会获得未定义的结果或锁定/崩溃您的程序。