为什么使用NSOperation,GCD或performSelectorInBackground我不能拍摄UIView的快照?

时间:2014-07-10 14:15:07

标签: ios uiview uiwebview

我正在尝试使用以下方法截取我UIView的屏幕截图。它只有在我不尝试在“背景”中执行此操作时才有效。但我需要它在背景中,因为每次它发射,我都有可怕的责任 - 没有任何作用几秒钟。

此方法有效,但当我暂停时,它会永久停留,并显示mach_msg_trap消息。

-(void)takeShoot{

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{

        float height;
        UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
        if(orientation == UIDeviceOrientationLandscapeLeft || orientation == UIDeviceOrientationLandscapeRight){
            height = 600;
        }else{
            height = 500;
        }
        UIGraphicsBeginImageContextWithOptions(CGSizeMake(self.view.frame.size.width, height), YES, 0.6);

        [self.view drawViewHierarchyInRect:CGRectMake(0, -60, self.view.frame.size.width, self.view.frame.size.height) afterScreenUpdates:YES];

                self.sharedImage = UIGraphicsGetImageFromCurrentImageContext();

            UIGraphicsEndImageContext();



    });
}

当我在NSOperation开火时,它变得更糟 - 只是不会没有任何理由这样做。 第三种方法performSelectorInBackground只是垃圾,如果我每次uiwebview完成加载时都会触发它,那么就会有数十亿个线程,而我认为它根本就不好。

那么,我怎样才能在后台(不在mainThread上)进行排版,而不是杀死或冻结任何人?

1 个答案:

答案 0 :(得分:0)

您必须在主线程上截取屏幕截图。这是UI稳定的唯一线程。

如果您有几秒钟的问题,我怀疑您还有其他问题,这只是暴露。最有可能是你在后台线程上进行的其他UIKit调用。这不受支持,会导致您描述的症状。