- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在设置与 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/
我的主 UI 线程调用 sendAsynchronousRequest NSURLConnection的方法获取数据。 [NSURLConnection sendAsynchronousRequest
在下面的方法中,如果我在completionHandler中进行数据处理,是否会阻塞主线程?换句话说,completionHandler 中执行的任何操作是在主线程上完成还是在后台线程上完成? + (
我打电话 [NSURLConnection sendAsynchronousRequest:request queue:queue
我正在尝试使用 POST 从 PHP 页面获取简单的文本响应。我有以下代码: func post(url: String, info: String) -> String { var URL:
我不想做的事情的示例: var b = 0 let URL: NSURL = NSURL(string: "[URL to php file]")! let request:NSMutableURL
我正在使用以下代码进行网络调用。我知道响应将在 mainQueue 中运行,因为我已将队列参数指定为 [NSOperationQueue mainQueue] 但我想知道实际的 sendAsynchr
我正在开发一个 iOS 应用程序,它可以将大量任务分派(dispatch)到我的串行队列。任务是从我的网络服务器下载图像,将其保存到磁盘,然后显示在 UIImageView 上。但是,[NSURLCo
我有一个创建 NSURLRequest 的方法,并使用 NSURLConnection 方法 sendAsynchronousRequest:queue:compltionHandler: 发送该请求
我正在编写一些执行 http 请求的 API 代码,并且我一直在使用 [NSUrlConnection:sendAsynchronousRequest:queue:completionHandler]
这是我的代码崩溃的部分: let bodyData = "username=" + username + "&password=" + password let URL: NSURL = NSURL(
我正在尝试使用 POST 从 PHP 页面获取简单的文本响应。我有以下代码: func post(url: String, info: String) -> String { var URL:
我正在使用 sendAsynchronousRequest:queue:completionHandler: 上传文件(我已经删除了一些旧的第三方库,以支持使用此 native 方法直接调用。我保留了
当我执行NSURLConnection.sendAsynchronousRequest时,它总是显示相同的错误: Invalid conversion from throwing function o
我的应用程序允许用户拍照并将其上传到 PHP 服务器。我使用 sendAsynchronousRequest 调用将数据(带有照片文件的表单)发送到服务器。调试时,所有这些调用在我的 iPad 2 上
每次用户打开应用程序时,我都必须加载 API 的刷新 token 。 在我的 appDelegate.m 中,每次应用程序打开时我都会调用此代码: if(success){ //if the url
对不起,我不知道这一点,但我想知道为什么我尝试建立与数据库的连接时会出现延迟。 我基本上是从数据库中提取数据以将信息显示回 UITableView,但连接建立似乎有延迟。 - (void)viewDi
如果互联网连接出现问题,我会尝试取消异步请求。 var connection: NSURLConnection! self.connection = NSURLConnection.sendAsync
我的应用程序中有几个内存泄漏(不!请参阅更新 1),它们都归结为异步 URLRequest。下面的代码给了我一个内存泄漏,似乎“数据”从未被释放(下面的代码在逻辑上没有在我的应用程序中使用,因为它是一
我用这段代码发出请求: - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{ //
.h @property (strong) NSString *reply; 我有以下方法: .m @synthesize reply; - (void)send { [NSURLConnecti
我是一名优秀的程序员,十分优秀!