Cocoa 异步网络&x2B;线程问题

Cocoa 异步网络&x2B;线程问题,cocoa,networking,multithreading,Cocoa,Networking,Multithreading,我启动一个网络请求,假设与目标服务器对话不需要登录凭据。如果它们是必需的,那么我将获得一个身份验证质询,此时我将显示一个视图,请求用户提供所述凭据。当它们被提供时,我使用这些凭据重新启动网络请求 只要我一次只做一个请求,那就好了。但我通常不是 当两个请求都被启动时,我得到第一个质询,并给出提示(使用-presentModalViewController:)。第二个挑战来了。当它试图显示第二个提示时,我崩溃了 我将大部分内容包装在@synchronized()块中,但这没有效果,因为这些委托方法都

我启动一个网络请求,假设与目标服务器对话不需要登录凭据。如果它们是必需的,那么我将获得一个身份验证质询,此时我将显示一个视图,请求用户提供所述凭据。当它们被提供时,我使用这些凭据重新启动网络请求

只要我一次只做一个请求,那就好了。但我通常不是

当两个请求都被启动时,我得到第一个质询,并给出提示(使用-presentModalViewController:)。第二个挑战来了。当它试图显示第二个提示时,我崩溃了

我将大部分内容包装在@synchronized()块中,但这没有效果,因为这些委托方法都是在同一(主)线程上调用的。文档称,委托方法是在启动连接的同一线程上调用的。好的,没问题;我将使用-performSelectorInBackground编写一个在后台线程上运行的方法:

NSURLConnection *connection = [[NSURLConnection alloc] 
                               initWithRequest:request 
                                      delegate:self
                              startImmediately:NO];
[connections addObject:connection];
[self performSelectorInBackground:@selector(startConnection:) 
                       withObject:connection];
[connection release];

它应该将每个网络请求及其回调放在自己的线程上,然后我的@synchronized()块就会生效

-initWithRequest的文档:。。。状态“发送给代理的消息将在调用此方法的线程上发送。默认情况下,为了使连接正常工作,调用线程的运行循环必须在默认运行循环模式下运行。”好的,我正在这样做

它们还声明“如果您[立即开始]通过NO,则必须在启动连接之前在运行循环中安排连接。”好的,我也在这样做

此外,NSRunLoop的文档还声明“每个NSThread对象(包括应用程序的主线程)都会根据需要自动为其创建一个NSRunLoop对象。如果需要访问当前线程的运行循环,可以使用类方法currentRunLoop。”我假设这适用于调用performSelectorInBackground创建的后台线程。。。(当我在-startConnection:method中执行'po[NSClassFromString(@“nsrunlop”)currentRunLoop]'时,情况似乎确实如此)

确实正在调用-startConnection:方法。但在启动连接后,我现在再也没有收到任何回电。没有-connectionId…委托方法。(我甚至尝试显式地启动线程的运行循环,但这没有什么区别;我以前使用过这样的线程,以前从来没有手动启动过运行循环——但我现在正在抓紧救命稻草……)

我想我已经想出了一个解决办法,这样我一次只能处理一个请求,但这很麻烦,我想用正确的方法来处理。但是,我在这里错过了什么

谢谢!
兰迪

[池漏]行到达?我猜是的。在此之后,-startConnection方法退出,此时后台线程完成并销毁。这可能不是你想要的

你必须运行runloop。你说你做了这件事,但没什么不同。这意味着你做错了。阅读文章(与其听我说,不如去找合适的医生)。注意,像-performSelectorInBackground这样的有用方法可能会使多线程看起来很吸引人,但这很困难

还有,你是什么意思

'包装在@synchronized()块中, 但这没有效果,因为这些 正在调用所有委托方法 在同一(主)线程上'

?

@synchronized()将在主线程上执行与在后台线程上相同的操作。。你认为它有什么作用

- (void)startConnection:(NSURLConnection *)connection {
   NSAutoreleasePool *pool = [NSAutoreleasePool new];
   [connection scheduleInRunLoop:[NSRunLoop currentRunLoop] 
                         forMode:NSDefaultRunLoopMode];
   [connection start];
   [pool drain];
}