我正在构建一个登录模块,其中用户输入的凭据在后端系统中得到验证。我正在使用异步调用来验证凭据,在用户通过身份验证后,我使用方法presentViewController:animated:completion
进入下一个屏幕。问题是presentViewController
方法启动是一个非常时间,直到呈现下一个屏幕。我担心之前对sendAsynchronousRequest:request queue:queue completionHandler:
的调用会以某种方式产生副作用。
只是为了确保我说4-6秒是在presentViewController:animated:completion
命令启动之后。我是这么说的,因为我正在调试代码并监视调用方法的时刻。
首先:调用NSURLConnection
方法:
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10.0];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
第二种:UIViewController
方法被称为运行异常时间
UIViewController *firstViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"FirstView"];
[self presentViewController:firstViewController animated:YES completion:nil];
感谢任何帮助。
感谢, 马科斯。
答案 0 :(得分:10)
这是从后台线程操纵UI的经典症状。您需要确保只在主线程上调用UIKit
方法。不保证在任何特定线程上调用完成处理程序,因此您必须执行以下操作:
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
UIViewController *firstViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"FirstView"];
[self presentViewController:firstViewController animated:YES completion:nil];
});
}
这可以保证您的代码在主线程上运行。