检查哪个请求来自NSURLConnection委托

时间:2012-04-27 21:09:42

标签: iphone objective-c ios ipad nsurlconnection

检查委托方法中哪个请求的最佳方法是什么:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{

}

现在我有一个NSURLConnection,我在发出请求之前设置为NSURLConnection,并在didReceiveResponse内部执行:

if (self.tempConnection == connection)
然而,有可能这对于竞争条件不起作用。有更好的方法吗?

3 个答案:

答案 0 :(得分:5)

在OS5中有更好的方法。忘记所有那些麻烦的委托消息。让连接为您构建数据,并将完成的代码与开始代码保持一致:

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.site.com"]];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];

[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
{
    NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response;
    NSLog(@"got response %d, data = %@, error = %@", [httpResponse statusCode], data, error);
}];

答案 1 :(得分:1)

我已经看了很多不同的方法来做到这一点,我发现到目前为止最干净最简单的方法是使用块模式。这样,您可以保证在完成时响应正确的请求,避免竞争条件,并且在异步调用期间您没有任何变量或对象超出范围的问题。阅读/维护代码也更容易。

ASIHTTPRequest和AFNetworking API都提供了一种阻止模式(但不再支持ASI,因此最好使用AFNetworking获取新内容)。如果您不想使用其中一个库,但想自己动手,可以下载AFNetworking的源代码并查看其实现。然而,这似乎是很多额外的工作,没什么价值。

答案 2 :(得分:1)

考虑创建一个单独的类作为委托。然后,对于每个生成的NSURLConnection,为该NSURLConnection实例化一个新的委托类实例

以下是一些简短的代码来说明这一点:

@interface ConnectionDelegate : NSObject <NSURLConnectionDelegate>

...然后实现.m文件中的方法

现在,我猜你可能有你在UIViewController子类中发布的代码(或其他一些用于不同目的的类)?

无论您何时开始请求,请使用以下代码:

ConnectionDelegate *newDelegate = [[ConnectionDelegate alloc] init];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"<url here">]];
[NSURLConnection connectionWithRequest:request delegate:newDelegate];

//then you can repeat this for every new request you need to make
//and a different delegate will handle this
newDelegate = [[ConnectionDelegate alloc] init];
request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"<url here">]];
[NSURLConnection connectionWithRequest:request delegate:newDelegate];

// ...continue as many times as you'd like
newDelegate = [[ConnectionDelegate alloc] init];
request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"<url here">]];
[NSURLConnection connectionWithRequest:request delegate:newDelegate];

您可以考虑将所有委托对象存储在NSDictionary或其他一些数据结构中以跟踪它们。我会考虑在connectionDidFinishLoading中使用NSNotification来发布连接完成的通知,并提供从响应创建的任何对象。 Lemme知道你是否想要代码来帮助你想象它。希望这有帮助!