ImagePicker Camera仅在后台线程中加载 - 否则它是黑屏

时间:2014-03-10 20:50:00

标签: ios iphone objective-c uiimagepickercontroller grand-central-dispatch

我有一个带有2个标签的基于标签的应用程序:第一个在后台线程中执行多个操作(下载json),并在获取结束时更新主线程上的UI。第二个选项卡出现时会立即显示相机。当我打开应用程序时,提取在标签#1的后台开始。如果我在标签1中的后台线程中切换到标签#2,则相机会加载。如果我等到主线程在切换到选项卡2之前更新了UI(仍然是选项卡1),则相机需要10秒钟才能加载,只显示黑屏。更奇怪的是,NSLogs告诉我相机应该已经装好了,但是黑屏出现了。我的问题是,有没有办法在标签#2出现时“清除”主线程,或者甚至更好,有没有办法在主线程中将摄像头显示为高优先级任务?

这是ViewDidAppear(标签2)中的代码:

 dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"4");
        [self showImagePickerForSourceType:UIImagePickerControllerSourceTypeCamera];
    });

下一步:

- (void)showImagePickerForSourceType:(UIImagePickerControllerSourceType)sourceType
{
    NSLog(@"5");

    dispatch_async(dispatch_get_main_queue(), ^{

        NSLog(@"6");

        [[UIApplication sharedApplication] setStatusBarHidden:YES];

        if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
        {
            NSLog(@"7");

            imagePickerController = [[UIImagePickerController alloc] init];
            imagePickerController.modalPresentationStyle = UIModalPresentationCurrentContext;
            imagePickerController.sourceType = sourceType;
            imagePickerController.delegate = self;
            imagePickerController.showsCameraControls = NO;

//            NSLog(@"HERE");


            if (isiPhone5)
            {
                NSLog(@"8");

                [[NSBundle mainBundle] loadNibNamed:@"OverlayView" owner:self options:nil];
            }
            else
            {
                NSLog(@"not 5");
                [[NSBundle mainBundle] loadNibNamed:@"Over2" owner:self options:nil];
            }

            self.overlayView.frame = imagePickerController.cameraOverlayView.frame;
            imagePickerController.cameraOverlayView = self.overlayView;
            self.overlayView = nil;


            self.imagePickerController = imagePickerController;
            [self presentViewController:self.imagePickerController animated:NO completion:nil];
            NSLog(@"9 DONE");
        }
    });

}

2 个答案:

答案 0 :(得分:0)

查看日志输出并不一定意味着您的相机视图可见,因此为什么在presentViewController:animated:completion:方法中为您提供了完成块。你有没有试过在那里放一些代码来看看它什么时候运行?

这是仪器中时间分析器工具的设计问题。如果您还没有,我强烈建议使用该工具进行调查,因为它基本上可以确定导致应用程序滞后的原因。

答案 1 :(得分:0)

我在这里发布了一个答案(iOS 7 UIImagePicker preview black screen),这可能是您问题的临时解决方案。本质上,UIImagePickerController在iOS 7中有内存泄漏,这意味着每次实例化都会变得越来越慢,直到你等待相机加载时有10秒以上的黑屏。

正如上面的链接中所提到的,我建议继承UIImagePickerController,或者只是在ViewController中将它作为一个实例变量,这样它才能实例化一次。

我知道你正在寻找一个更像“清除主队列”的答案,但希望这会在此期间帮助你。