0

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

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

}

现在我有一个 NSURLConnection ,我在发出请求之前设置为 NSURLConnection 并在里面didReceiveResponse做:

if (self.tempConnection == connection)

但是有可能这不适用于竞争条件。有一个更好的方法吗?

4

3 回答 3

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);
}];
于 2012-04-27T22:14:03.957 回答
1

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

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

于 2012-04-27T22:13:44.430 回答
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 来发布连接完成的通知,并提供从响应创建的任何对象。让我知道您是否需要代码来帮助您将其可视化。希望这可以帮助!

于 2012-04-27T23:26:17.120 回答