dismissViewControllerAnimated:completion:有几秒延迟

时间:2013-01-15 16:03:07

标签: iphone ios objective-c ios6 uikit

dismissViewControllerAnimated:completion:在我的应用程序中工作正常,除了解雇之间的延迟。

[api loginWithUsername:[dict objectForKey:@"username"] andPassword:[dict objectForKey:@"password"] andSuccessBlock:^(id json) {
    NSLog(@"DONE... %@", [json objectForKey:@"status"]);
    NSString *status = [json objectForKey:@"status"];
    if([status isEqualToString:@"ok"]){
        app.user = [json objectForKey:@"data"];
        [self dismissViewControllerAnimated:YES completion:nil];
    }else{
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"could not log you in" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
        [alert show];
    }
}];

在我的控制台中,我可以看到echo'ed“DONE ... ok”,这意味着回调块已被执行,但是大约3-4秒后,模态视图最终被解除。

什么可能导致这种延迟?

3 个答案:

答案 0 :(得分:34)

如果您不保证您的UI代码在主线程上运行,它可能会在其他一些线程上运行,在这种情况下,您将遇到几秒延迟!

您可以添加此项以确保在主线程上运行解雇:

dispatch_async(dispatch_get_main_queue(), ^{
    [self dismissViewControllerAnimated:YES completion:nil];
});

通常,这不是问题,因为大多数代码已经在主线程上运行,因为我们主要添加从UIKit方法运行的代码,例如viewDidLoad等。保证这些方法在主线程上运行。

当您最终在另一个线程上运行代码时,会出现问题。例如,在网络库的完成块调用上,请求在后台完成。

答案 1 :(得分:3)

检查ParentViewController的'viewWillAppear'和currentViewcontroller的'viewWillDisappear'。 确保这两个函数没有任何繁重的计算和内存分配。

答案 2 :(得分:0)

尝试更改

NSString *status = [json objectForKey:@"status"];
NSLog(@"DONE... %@", status);

然后尝试

  

if([status isEqualToString:@“ok”]){

    [self dismissViewControllerAnimated:YES completion:nil];
    app.user = [json objectForKey:@"data"];
}else{

因为我不知道你的JSON对象有多大,所以可能需要花一点时间来响应,当你在日志语句之后再次调用它并在执行其他操作之前再说它可能就是这样。