2

我正在构建一个登录模块,用户输入的凭据在后端系统中得到验证。我正在使用异步调用来验证凭据,并且在用户通过身份验证后,我使用该方法进入下一个屏幕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];

任何帮助表示赞赏。

谢谢,马科斯。

4

1 回答 1

12

这是从后台线程操作 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];
    });
}

这保证了您的代码在主线程上运行。

于 2013-02-26T00:40:29.443 回答