gpt4 book ai didi

cocoa - 异步网络+线程问题

转载 作者:行者123 更新时间:2023-12-03 17:26:46 28 4
gpt4 key购买 nike

我启动一个网络请求,假设不需要登录凭据即可与目标服务器通信。如果需要,我会收到身份验证质询,此时我会显示一个 View ,请求用户提供所述凭据。当提供它们时,我使用这些凭据重新启动网络请求。

这一切都很好,只要我一次只执行一个请求即可。但我通常不是。

当两个请求都启动时,我收到第一个挑战,并显示提示(使用 -presentModalViewController:)。然后第二个挑战出现了。当它尝试显示第二个提示时我崩溃了。

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

NSURLConnection *connection = [[NSURLConnection alloc] 
initWithRequest:request
delegate:self
startImmediately:NO];
[connections addObject:connection];
[self performSelectorInBackground:@selector(startConnection:)
withObject:connection];
[connection release];
<小时/>
- (void)startConnection:(NSURLConnection *)connection {
NSAutoreleasePool *pool = [NSAutoreleasePool new];
[connection scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
[connection start];
[pool drain];
}

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

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

他们还指出“如果您传递 NO [for startImmediately],则必须在启动之前在运行循环中安排连接。”好的,我也在这么做。

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

确实正在调用 -startConnection: 方法。但在启动连接后,我现在再也没有收到任何回调。没有 -connectionDid... 委托(delegate)方法。 (我什至尝试显式启动线程的运行循环,但这没有什么区别;我以前使用过这样的线程,而且以前从未需要手动启动运行循环——但我现在捕获了救命稻草。 ..)

我想我已经想出了一种解决方法,让我一次只处理一个请求,但这很糟糕,我想以正确的方式做到这一点。但是,我在这里缺少什么?

谢谢!兰迪

最佳答案

是否已到达[pool dial];线?我猜是的。此后 -startConnection 方法退出,此时后台线程完成并销毁。这可能不是您想要的......

你必须运行runloop。你说你做了这件事,但这并没有什么区别。这说明你做错了。阅读Runloop section in the Threaded Programming Guide (最好去正确的文档而不是听我说)。请注意,像 -performSelectorInBackground 这样的有用方法可能会让多线程看起来很有吸引力,但它很困难。

另外,你什么意思

'wrapped in an @synchronized() block, but this has no effect because these delegate methods are all being called on the same (main) thread'

@synchronized() 将在主线程上执行与在后台线程上相同的操作。您认为它会做什么?

关于cocoa - 异步网络+线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2978458/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com