2 daffodilgirl DaffodilGirl 于 2013.01.16 10:08 提问

dismissViewControllerAnimated有延迟

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];
    }
}];

在控制台可以看见DONE... ok。,意味着回调block执行正常,但是接下来需要三四秒钟延迟视图才能最终被dismiss。

怎么解决这个延迟问题?谢谢

2个回答

Chengzi_963
Chengzi_963   2013.01.16 14:20
已采纳

如果你不能保证UI代码运行在主线程中,它可能就运行到其他地方去了,这样的话会出现几秒钟的延迟。

添加下面的代码可以让dismissal运行在主线程中:

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

代码只给了一部分,无法看出什么问题。
从这个函数名上推测:应该是使用用户名密码登录时请求了网络连接,视图dismiss的这个三四秒中的延迟应该是网络连接造成的。而这个网络连接没有使用异步,或者是使用了异步连接但是SuccessBlock里的代码段只会在网络连接请求成功后调用。

建议将dismiss放到别的地方去。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!