我正在将视图转换为位图图像。这称为光栅化。我试图将光栅化卸载到另一个线程,因此我的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?
答案 0 :(得分:0)
几乎所有UIKit对象都不是线程安全的。您可以在单独的线程中运行它们,而不会获得未定义的结果或锁定/崩溃您的程序。