这可能比具体问题更具存在性,但我在我的应用中遇到了一些用户体验问题。
在我的应用程序中,我有一个任务,将UIView转换为UIImage,进行一些屏幕外处理,并更新用户的UI。所有这些都发生在主队列上,这是UIKit任务所需要的。
我希望在我的应用中有一个活动指示器(我使用的是自定义设计的,但是常规的UIActivityIndicator演示了同样的问题),我也在主要队列上运行,在上述任务之前
我的问题是,一旦UIView处理开始,我的活动指示器会冻结,直到任务完成。这显然是由于主队列处理另一个更密集的任务,因此悬挂旋转器。我的好奇心是;无论主队列上发生的UI工作如何,我如何确保微调器继续?
谢谢!
答案 0 :(得分:1)
我担心除非你在后台线程上进行重量级操作,否则这是不可能的。
如果可以的话,你可以尝试通过将操作分成较小的部分来给主线提供一点呼吸空气。这至少会允许对微调器进行一些更新。
虽然我认为您应该继续拍摄图像并更新主线程上的UI,考虑将处理图像放在后台线程中,如果可能的话。
答案 1 :(得分:1)
我同意米兰的观点。我建议略有不同的流程:
开始活动指示器旋转。
抓取您的视图并将其转换为图片。
将图像处理传递给GCD后台队列进行处理,并传入完成处理程序。
当后台处理完成时,在主线程上调用完成处理程序。在完成处理程序的主体中,停止/隐藏活动指示器。
答案 2 :(得分:1)
我会建议这样的事情。
-(void)render {
startSpinner();
backgroundRenderQueue = dispatch_queue_create("backgroundQueue",DISPATCH_QUEUE_CONCURRENT);
dispatch_async(backgroundQueue, ^{
//Render image here
UIImage *image = [UIImage imageWithCGImage:CGBitmapContextCreateImage(context)];
dispatch_async(dispatch_get_main_queue(), ^{
self.imageview.image = image;
stopeSpinner()
});
});
}