iOS 5+ - 在执行请求时卡住主线程执行

标签 ios multithreading rest request

我正在 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/

相关文章:

iphone - nib 文件未在 Xcode 4 中打开

ios - 移除 UITabbar 上边框线

java - Android 设备有多少个核心?我可以使用多少个线程来获得最佳性能?

spring - 服务和 Controller 层异常处理设计模式

javascript - meteor Restivus : Method PUT is not allowed by Access-Control-Allow-Methods in preflight response

iphone - 如何从 iPhone 数据库中仅检索 3imagepaths 或 id

c++ - 使用 C++ 访问 iOS 上的文档文件夹

c - 为什么 futex 在唤醒线程时比 mutex 花费更长的时间?

c - 在c中,宏__FILE __,__ LINE__和__PRETTY_FUNCTION__是否分配内存?

java - 服务器始终使用 Jersey 2 + Tomcat 6 返回 404 错误