2011-11-14 98 views
3

每当我使用下面的代码的卷曲电话:如何在同一个委托中使用connectionDidFinishLoading处理不同的请求?

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]; 
} 

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

回答

1

看一看这个S.O. post对有关NSURLConnection和多requests.The建议配方做这样的事情:

- (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中阅读有关它们。

+0

感谢您的快速响应和帖子。顺便说一句,我如何区分第一和第二连接?是否有可以检查的连接标题/标识符?谢谢 – sonoluminescence

+0

请看我的编辑,希望它有帮助。无论如何,没有连接标识符,这就是您使用地址的原因。 – sergio

+0

明白了,谢谢Sergio! – sonoluminescence

1

是有2个选项来做到这一点:

  1. 你可以实现一个单独的类,这将是负责处理NSURLConnection的代表的东西,并为每个请求
  2. 您可以使用NSObject的创建一个单独的实例在NSURLConnection的实例键值的方法来设置一些标签,将要在connectionDidFinishLoading检查:方法

对于我来说,选项1将是一个更好的办法

+0

太棒了!谢谢,丹尼斯 – sonoluminescence

相关问题