我正在 iOS 应用程序中实现一些 RESTful API,目前我正在处理登录功能。用户输入用户名和密码,当按下登录时,会发生以下情况:
网络事件指示器变得可见,文本标签变得隐藏(以及登录按钮),事件指示器变得可见,并且带有文本“登录”的标签。然后:
dispatch_async(queue,
^{[self performSelectorOnMainThread:@selector(performAuthCall)
withObject:nil waitUntilDone:YES];});
在 performAuthCall 方法中, View Controller 的属性( bool 值)设置为 YES 或 NO,具体取决于登录是否成功(我使用 NSURLConnection 的 sendSynchronousRequest)。如果是,则显示另一个 View Controller 。如果不是,则会显示警报。 我并没有真正得到我想要的结果, Controller 在执行请求之前正在测试成功的登录 bool 值,我尝试了不同的方法但我无法让它正常工作并且不卡住 UI。所以,我的问题是:
我怎样才能首先使所有隐藏/显示的东西(比如使事件指示器和“登录”标签可见),然后开始授权过程,等到它完成,然后才转到另一个 View Controller 或显示警报或其他东西?
最佳答案
改用 NSURLConnection sendAsynchronousRequest:::
[NSURLConnection sendAsynchronousRequest:request
queue:[NSOperationQueue currentQueue]
completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
NSLog(@"response = %@", response);
//do the UI update/segue here once completed.
}];
这样您就不会在 url 加载期间阻塞主线程。
关于iOS 5+ - 在执行请求时卡住主线程执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15928505/