gpt4 book ai didi

ios - 多次使用 NSURLConnection

转载 作者:行者123 更新时间:2023-11-29 11:02:46 24 4
gpt4 key购买 nike

我正在尝试在启动第一个 NSURLConnection 后启动第二个 NSURLConnection。我的第一个完美运行:所有适当的代表都被调用,一切都按计划执行。但是,在第一个完成后,我创建了第二个,但没有任何反应(永远不会调用委托(delegate))。会发生什么?我知道我不能重复使用同一个 NSURLConnection,但我在再次使用它之前重新初始化它,所以它应该是一个全新的连接。

这是我用于启动(两个)连接的代码。它是相同的实例变量,但已重新初始化。另请注意,直到第一个完全运行完毕后,第二个才会启动。

if (connection) {
[connection cancel];
}

currentResponse = nil;
error = nil;

connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
if (!connection) {
NSLog(@"Connection could not be initialized.");
[self connectionFinished];
} else {
[connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[connection start];
}

最佳答案

您还没有分享如何在“不同线程”上运行它,但典型的问题是,如果您使用调度队列或操作队列,您的连接本身是异步运行的,因此调度操作是完成并被释放,你就失去了联系。

一些可能的解决方案:

  1. 您可以在您的后台操作中同步执行您的网络操作(这是您唯一应该进行同步网络操作的时间)。这是最简单的解决方案,尽管您还没有解释您正在使用 NSURLConnection 做什么,因此该技术可能适合您也可能不适合您。但是如果你只是想从一个 URL 下载一些东西,你可以这样做:

    NSData *data = [NSData dataWithContentsOfURL:url
    options:0
    error:&error];

    如果您正在做任何需要 NSURLConnectionDataDelegate 的更复杂的事情,这种方法就不起作用了。方法,例如挑战-响应身份验证,或者如果您正在使用 didReceiveData 进行流式传输以减少应用程序的内存占用或出于性能原因等。但是如果您只是想从远程服务器下载数据(例如检索图像、XML/JSON 提要等),这是最简单的。

  2. 以类似的方式(即您不需要 NSURLConnectionDataDelegate 方法),但是您正在为您的连接创建一些丰富的 NSURLRequest , 那么您可以使用 sendAsynchronousRequestsendSynchronousRequest .

  3. 如果您需要 NSURLConnectionDataDelegate 调用,您可以使用 setDelegateQueue (指定一个 NSOperationQueue)或 scheduleInRunLoop (指定一个 NSRunLoop),它会自动将连接更新分派(dispatch)到适当的队列/runloop。只需确保 initWithRequest 使用 NOstartImmediately 选项,设置委托(delegate)队列或运行循环,然后 start连接。使用这种技术,如果您绝对需要它,您可以保留 NSURLConnectionDataDelegate 的全部丰富性。

  4. 或者,如果您不使用操作队列,您也可以让后台操作保持事件状态,直到连接完成。这种方法在后台操作中为您提供同步行为(保持连接有效),同时保留 NSURLConnectionDataDelegate 方法。 Apple's XMLPerformance Sample 演示了此技术。 (参见 CocoaXMLParser.m 和 LibXMLParser.m 的 downloadAndParse 方法),它们在其中启动 NSURLConnection,然后使用以下构造使后台操作保持事件状态,直到 NSURLConnectionDataDelegate 方法最终设置了 done 实例变量:

    do {
    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
    beforeDate:[NSDate distantFuture]];
    } while (!done);

我承认,我发现这种最后的方法有点不满意,并且会倾向于其他替代方法,具体取决于您需要从 NSURLConnection 获得什么样的灵 active 和功能。为了让我们提供更有意义的建议,您只需要提供更多信息:(a) 您在 NSURLConnectionDataDelegate 方法中所做的工作; (b) 您使用哪种技术在后台运行您的代码。

如需更多选项,请随时查看 GCD and async NSURLConnection .

关于ios - 多次使用 NSURLConnection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15099023/

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