如何在同一个委托中使用connectionDidFinishLoading处理不同的请求?

时间:2011-11-14 11:20:28

标签: objective-c ios5

每当我使用以下代码进行卷曲调用时:

NSURL *url = [NSURL URLWithString:requestURL];
NSURLRequest *request = [NSURLRequest requestWithURL:url
cachePolicy:NSURLRequestReloadIgnoringLocalCacheData 
timeoutInterval:30];
if (connectionInProgress) {
    [connectionInProgress cancel];
}
connectionInProgress = [[NSURLConnection alloc]initWithRequest:request delegate:self     startImmediately:YES];

connectionDidFinishLoading是我的最终目的地,我可以操作响应数据并调用我的下一个方法继续使用该应用程序。如果我硬编码某些特定任务,如

-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:xmlData];
[parser setDelegate:self];
[parser parse];
[someLabel setText:parsedTextFromXMLData];
}

如果我需要对另一个地址进行另一个curl调用,那么someLabel setText是否总是会重新设置?有没有办法让这个委托函数在每个curl调用上表现不同? (顺便说一下,connectionDidFinishLoading通常是放置下一步代码的正确位置吗?)如果是这样,那么下次卷曲调用是否会再次调用它?

2 个答案:

答案 0 :(得分:1)

有两个选项可以做到这一点:

  1. 您可以实现一个单独的类,负责处理NSURLConnection委托内容并为每个请求创建单独的实例
  2. 您可以在NSURLConnection实例上使用NSObject键值方法来设置一些标记,这将在connectionDidFinishLoading中检查:方法
  3. 对我来说,选项1将是更好的方法

答案 1 :(得分:1)

请查看此S.O. post以获取有关NSURLConnection和多个请求的食谱。建议如下:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
  if (connection == firstConnection) {
    // do something
   }
   else if (connection == secondConnection) {
    // do something else
   }
 } 

编辑:这里的想法是connectionDidFinishLoading是你自己的委托的一个方法(所以你写它)。在委托中,您存储您创建的每个连接的地址;然后,当连接返回数据时,通过将其地址与存储在委托中的地址进行比较,可以确定它是哪个连接。 -END编辑

另一个选择是使用ASIHTTPRequest framework,它提供基于请求(而不是基于连接)的委托机制,因此每个请求都有一个委托对象来处理结果;或者换句话说,代表收到对请求的引用,因此您可以轻松地告知您正在处理哪个请求结果。

ASIHTTPRequest提供了一些优于NSURLConnection的优势。您可以在此S.O. post中了解它们。