我正在使用 NSURLConnection 异步调用从服务器加载数据。在使用 performSelectorInBackground 调用服务方法时,该方法被调用但 NSURLConnection 不提供任何响应。我正在使用异步调用,因为我必须先验证身份验证。每当我尝试服务调用时主线程它给了我正确的数据,但 UI 被冻结。1)如何使用 performSelectorInBackground 进行异步调用我通过异步加载数据做错了什么。
任何帮助将不胜感激
我正在使用 NSURLConnection 异步调用从服务器加载数据。在使用 performSelectorInBackground 调用服务方法时,该方法被调用但 NSURLConnection 不提供任何响应。我正在使用异步调用,因为我必须先验证身份验证。每当我尝试服务调用时主线程它给了我正确的数据,但 UI 被冻结。1)如何使用 performSelectorInBackground 进行异步调用我通过异步加载数据做错了什么。
任何帮助将不胜感激
这是一种可能的方式,虽然不是通过 NSURLConnection,但它不会阻塞:
NSURL *xmlURL = [NSURL URLWithString:URL];
if (self.xmlParser != nil)
{
[self.xmlParser abortParsing];
self.xmlParser = nil;
}
dispatch_queue_t loadQueue1 = dispatch_queue_create("loadQueue1", NULL);
// Use another thread to avoid blocking main thread
dispatch_async(loadQueue1,^{
self.xmlParser = [[[NSXMLParser alloc] initWithContentsOfURL:xmlURL] autorelease];
// -------------------------------------------------------------------
[self.xmlParser setDelegate:self];
dispatch_async(dispatch_get_main_queue(),^{
if (self.xmlParser != nil)
{
[self.xmlParser parse];
}
});
});
dispatch_release(loadQueue1);
如果您使用NSURLConnection
异步 API,则无需使用performSelectorInBackground
. 您从主线程调用它,并设置一个委托,当数据到来或另一个事件发生时将调用委托,而不会阻塞主线程。
好的,在调试代码后我得到了错误。这不是异步调用,而是接收到巨大响应后的更新方法冻结了我的 UI。我用来打印数据的 NSLog 也导致了这个问题。