多个"主队列"用户视角的任务

时间:2018-02-15 20:38:47

标签: ios swift grand-central-dispatch

这可能比具体问题更具存在性,但我在我的应用中遇到了一些用户体验问题。

在我的应用程序中,我有一个任务,将UIView转换为UIImage,进行一些屏幕外处理,并更新用户的UI。所有这些都发生在主队列上,这是UIKit任务所需要的。

我希望在我的应用中有一个活动指示器(我使用的是自定义设计的,但是常规的UIActivityIndi​​cator演示了同样的问题),我也在主要队列上运行,在上述任务之前

我的问题是,一旦UIView处理开始,我的活动指示器会冻结,直到任务完成。这显然是由于主队列处理另一个更密集的任务,因此悬挂旋转器。我的好奇心是;无论主队列上发生的UI工作如何,我如何确保微调器继续?

谢谢!

3 个答案:

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