UITabBarController setSelectedIndex性能缓慢

时间:2015-01-12 11:20:44

标签: ios objective-c uiviewcontroller uitabbarcontroller dispatch-async

当用户按下中心UITabBarItem时,我会显示模式UIView。把它想象成Instagram吧。

-(BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController{

if(viewController == [self.viewControllers objectAtIndex:2])
{
    CameraViewController *cameraVC = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"cameraVC"];
    UINavigationController* navController = [[UINavigationController alloc] initWithRootViewController:cameraVC];
    navController.navigationBar.barStyle = UIStatusBarStyleLightContent;
    [self presentViewController:navController animated:YES completion:nil];
    return NO;
}
else
{
    return YES;
}
}

这完美无缺。

当我在CameraViewController中拍摄照片时,我希望视图被取消,并且为图片的结果选择第4 UITabBarItem(HistoryViewController)。

这就是我在CameraViewController中做的那样(模块推送的人):

[self dismissViewControllerAnimated:YES completion:nil];

[(UITabBarController *)self.presentingViewController setSelectedIndex:3];

这就是它出错的地方。

enter image description here

如您所见,第4个选项卡中的文本已被选中,但第一个选项卡图标仍处于选中状态。此外,显示的视图是第一个选项卡中的视图。

10秒左右后,它最终将视图更改为正确的第4个标签。

我试图找出导致这种放缓的过程,因此我设置了很多NSLog。

大约10秒的减速时间在CameraViewController中的[(UITabBarController *)self.presentingViewController setSelectedIndex:3];与HistoryViewController中的viewDidLoad之间。

这些可能导致减速的调用/方法之间发生了什么?

编辑:

在CameraViewController中:

- (void)scan {
dispatch_queue_t scanTesseract = dispatch_queue_create("scanTesseract", NULL);

dispatch_async(scanTesseract, ^(void) {
    dispatch_async(dispatch_get_main_queue(), ^{
        [SVProgressHUD setForegroundColor:[UIColor ht_mintDarkColor]];
        [SVProgressHUD showProgress:0 status:@"Scanning"];
    });

    //background processing goes here
    [self.tesseract setImage:self.imgToScan.blackAndWhite];
    [self.tesseract recognize];
    [self filterResults:[self.tesseract recognizedText]];
    dispatch_async(dispatch_get_main_queue(), ^{
        [SVProgressHUD dismiss];
    });
    [self scanningDone];
});
}

- (void)scanningDone {
[LastScan getInstance].hasBeenViewed = FALSE;

[self dismissViewControllerAnimated:YES completion:nil];

[(UITabBarController *)self.presentingViewController setSelectedIndex:3];
}

在HistoryViewController中:

- (void)viewDidLoad {
[super viewDidLoad];

NSLog(@"ViewDidLoad");
self.navigationController.navigationBar.barStyle = UIStatusBarStyleLightContent;

self.collectionView.backgroundColor = [UIColor whiteColor];
}

2 个答案:

答案 0 :(得分:1)

您正在后台队列中调用您的scanDone。在主队列上执行该方法。

dispatch_async(dispatch_get_main_queue(), ^{
   [self scanningDone];
});

答案 1 :(得分:0)

这个怎么样?

[self dismissViewControllerAnimated:YES completion:^{
    [(UITabBarController *)self.presentingViewController setSelectedIndex:3];
}];