gpt4 book ai didi

ios - 创建多个 NSURLConnections 并使用 sendAsynchronousRequest :queue:completionHandler: iOS 5 method

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:19:52 26 4
gpt4 key购买 nike

我在设置与 sendAsynchronousRequest:queue:completionHandler: 方法(NSURLConnection 类)相关的正确配置时遇到了一些困难。

我的场景如下:

我设置了一个单例类来管理不同的 NSURLConnection。此单例实例有一个 NSOperation Queue(称为 downloadQueue),它向 Web 服务器发出请求并检索字符串路径 (1)。完成后,该路径用于在 Web 服务器 (2) 中下载文件。最后,当文件已正确下载后,我需要更新 UI (3)。

我只计算出第一个请求:我可以通过它下载路径的请求。你能建议我执行其他两个步骤的方法吗?

这里有几个问题:

  • 下载队列 (downloadQueue) 不是主要队列,是否可以在该队列中打开一个新的 NSURLConnection?换句话说,它是正确的吗? (查看代码片段中的注释)

  • 如果前面的问题是正确的,我该如何抓取主队列并更新 UI?

这里是我用来执行第一步的代码片段,其中 downloadQueue 是一个实例变量,可以通过访问器方法 (@property/@synthesized );

// initializing the queue...
downloadQueue = [[NSOperation alloc] init];

// other code here...
[NSURLConnection sendAsynchronousRequest:urlRequest queue:[self downloadQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {

if([data length] > 0 && error == nil) {

// here the path (1)
// how to perform a second connection?
// what type of queue do I have to use?
}
}];

最佳答案

您的第一次下载是正确的。

在第一次下载后的完成处理程序 block 中,您正在计算第二次下载所需的 URL,对吧?然后您可以以相同的方式执行第二次下载:使用新的 URL 和相同的队列再次调用 +[NSURLConnection sendAsynchronousRequest:...]。您可以在第一次下载的完成 block 中执行此操作。

要在第二次下载完成后更新 UI,请切换到该下载的完成 block 内的主队列。您可以使用 dispatch_async()dispatch_sync() 执行此操作(在这种情况下,哪个并不重要,因为您没有对下载队列做进一步的工作) 和 dispatch_get_main_queue(),或者使用 -[NSOperationQueue addOperationWithBlock:]+[NSOperationQueue mainQueue]

您的代码应如下所示:

// init download queue
downloadQueue = [[NSOperationQueue alloc] init];

// (1) first download to determine URL for second
[NSURLConnection sendAsynchronousRequest:urlRequest queue:[self downloadQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
if([data length] > 0 && error == nil) {
// set newURLRequest to something you get from the data, then...
// (2) second download
[NSURLConnection sendAsynchronousRequest:newURLRequest queue:[self downloadQueue] completionHandler:^(NSURLResponse *newResponse, NSData *newData, NSError *newError) {
if([newData length] > 0 && newError == nil) {
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
// (3) update UI
}];
}
}];
}
}];

关于ios - 创建多个 NSURLConnections 并使用 sendAsynchronousRequest :queue:completionHandler: iOS 5 method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10198433/

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