我有一个带有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");
}
});
}
答案 0 :(得分:0)
查看日志输出并不一定意味着您的相机视图可见,因此为什么在presentViewController:animated:completion:
方法中为您提供了完成块。你有没有试过在那里放一些代码来看看它什么时候运行?
这是仪器中时间分析器工具的设计问题。如果您还没有,我强烈建议使用该工具进行调查,因为它基本上可以确定导致应用程序滞后的原因。
答案 1 :(得分:0)
我在这里发布了一个答案(iOS 7 UIImagePicker preview black screen),这可能是您问题的临时解决方案。本质上,UIImagePickerController在iOS 7中有内存泄漏,这意味着每次实例化都会变得越来越慢,直到你等待相机加载时有10秒以上的黑屏。
正如上面的链接中所提到的,我建议继承UIImagePickerController,或者只是在ViewController中将它作为一个实例变量,这样它才能实例化一次。
我知道你正在寻找一个更像“清除主队列”的答案,但希望这会在此期间帮助你。