UINavigationController花时间推送ViewController

时间:2014-12-05 01:36:04

标签: ios uinavigationcontroller objective-c-blocks

请使用以下代码:

[[[Resource alloc] init] get:@"/api/v1/basic_user/40/" params:nil completion:^(NSURLResponse *response, NSDictionary *data, NSError *connectionError) {
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil];
    HomeViewController *homeView = [storyboard instantiateViewControllerWithIdentifier:@"HomeViewController"];

    NSLog(@"pushing...");
    [self.navigationController pushViewController:homeView animated:YES];
}];

这打印"推"大约10(非精确)秒后,HomeViewController出现。 initWithCoder(从故事板中实例化ViewController)绝对没有任何内容。在推送我的VC之后,这就被调用了。

但我的viewDidLoad方法需要几秒钟才能加载。我无法说出多少秒,因为它不准确。它有时根本不会加载! (例如我的HomeViewController没有显示。

这是更棘手的部分。如果我将推送方法移到我的块之外,一切都像魅力一样。

发生了什么?为什么我的VC在块内部时这么慢?

编辑:

调用我的资源中的方法时,唯一使用线程的是下面的代码:

[NSURLConnection sendAsynchronousRequest:_request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError){
    NSLog(@"%@", [[NSJSONSerialization JSONObjectWithData:data options:0 error:nil] description]);
    [self toggleNetworkActivityIndicator];

    _lastResponse = response;
    success(response, data, connectionError);
}];

2 个答案:

答案 0 :(得分:6)

我能想到的唯一一件事就是你在资源方法中所做的就是通过派遣在另一个线程上。因此,请尝试将推送视图控制器包含在大中央dispatch中,然后将其重新包装回主队列,如下所示:

dispatch_async(dispatch_get_main_queue(), ^{
    // Push view controller here
}); 

这解决了一些问题,当我执行动画时,需要5-10秒才能完成通常只需要半秒钟的事情。 希望这会有所帮助。

答案 1 :(得分:2)

Swift 3

DispatchQueue.global(qos: .background).async {
            DispatchQueue.main.async {
                //write your code here
            }
        }