16

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”,这意味着回调块已执行,但是大约 3-4 秒后,模态视图最终被关闭。

什么可能导致这种延迟?

4

3 回答 3

35

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

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

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

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

当您最终在另一个线程上运行代码时,就会出现问题。可能发生这种情况的一种情况是,例如在网络库的完成块调用中,请求是在后台完成的。

于 2013-01-15T18:37:14.503 回答
3

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

于 2013-01-15T16:04:56.120 回答
0

尝试改变

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

然后尝试

if([状态 isEqualToString:@"ok"]){

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

因为我不知道你的 JSON 对象有多大,它可能需要一点时间来响应,并且你在 log 语句之后再次调用它并且在说解雇之前做其他事情可能就是这样。

于 2013-01-15T16:32:06.243 回答