iphone - dismissViewControllerAnimated :completion: has a couple second delay

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

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

是什么导致了这种延迟?

最佳答案

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

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

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

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

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

关于iphone - dismissViewControllerAnimated :completion: has a couple second delay,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14341739/

相关文章:

ios - NSURLProtocol 不响应 UIWebviews

objective-c - 为什么 UIView.exclusiveTouch 不起作用?

iphone - 如何在点击按钮时显示键盘?

iphone - 获取 GDataFeedPhotoAlbum 返回错误的对象类型

ios - 将swift数组转换为对象以进行json序列化

objective-c - 将选定的单元格保持在大量 reloadRowsAtIndexPaths UITableView 上

objective-c - Swift 中的 self 和 unowned self 有什么区别?

iphone - iPhone 应用程序安装次数

iphone - 我们可以直接访问核心数据的SQLite数据库吗

ios - 某些文件位于我的 iOS 应用程序的 "MyApp"目录之外 - 为什么?