我打算使用NSURLConnection创建2个请求。当服务器响应并调用connectionDidFinishLoading时,它将连接作为参数传递,但是如何识别传入的连接?
答案 0 :(得分:12)
将两个NSURLConnection对象保存为您传递给connectionWithRequest的任何委托对象的成员变量:delegate:。然后你可以将每一个与传递给connectionDidFinishLoading的NSURLConnection进行比较,并做出适当的响应:
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
if (connection == firstConnection) {
// do something
}
else if (connection == secondConnection) {
// do something else
}
}
另一个稍微更面向对象的选项是创建两个不同的委托对象,每个委托对象都知道如何处理每种类型的连接。然后在创建每个连接时传递适当的委托。这样你就不需要检查你有哪个连接,因为每个委托只接收connectionDidFinishLoading:为自己的连接。
答案 1 :(得分:2)
我也喜欢每个连接的不同代表。虽然这有点开销。幸运的是,您可以使用块来简化操作。这是标准SDK中不存在的新功能,但您可以使用3rd-party framework called PLBlocks。 Here is an article关于如何使用它们,它还包含NSURLConnection的示例。
这是使用块回调发出HTTP请求的客户端代码:
NSURLRequest *req = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.google.com"]];
[NSURLConnection sendAsynchronousRequest:req onCompletionDo: ^(NSData *data, NSURLResponse *res, NSError *err) {
NSLog(@"data: %ld bytes. res: %@, error: %@", (long)[data length], res, err);
[cell.activity stopAnimating];
}];
答案 2 :(得分:1)
我在项目中所做的是为连接创建一个包装类。这样,您可以为所需的每个连接保留一个新实例,并在另一个管理器类中维护这些类。
像[AsynchronousConnection initWithURL:delegate:selector:]
这样的东西然后你可以确保在NSURLConnection完成/失败时调用正确的东西。
答案 3 :(得分:1)
我曾经在NSURLConnection
周围创建自定义包装器,但我现在切换到ASIHTTPRequest。这是一个非常棒的库,提供比NSURLConnection
更多的灵活性和功能。看看并尝试一下,这真的很值得。
答案 4 :(得分:0)
转到NSURLConnection.h文件,您将找到以下内容。
创建时,NSURLConnection执行的深层复制 的NSURLRequest。此副本可通过-originalRequest获得 方法。当连接执行加载时,此请求可能会更改 作为协议规范化或由于遵循的结果 重定向。 -currentRequest可用于检索此值。
最终[connection currentRequest] .URL absoluteURL可能会有所帮助。
此致 人员Prasanna。