在单独的NSThread上实现异步下载(NSURLConnection)?

时间:2011-03-13 14:25:16

标签: iphone nsurlconnection

这可能听起来很奇怪,但请耐心等待。我有6-7个API调用,它们逐个向服务器发出请求。我想在一个单独的线程中实现这些调用。但是当我这样做时,即使在管理一个单独的NSRunloop之后,也没有调用我的委托方法(NSURLConnection)  ([[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];)

任何人都可以建议我使用替代方法进行相同或任何现有功能的修正吗?

4 个答案:

答案 0 :(得分:0)

请改用ASIHTTPRequest。它比NSURLConnection更容易使用。

答案 1 :(得分:0)

快速谷歌提出这个:http://blog.emmerinc.be/index.php/2009/03/15/multiple-async-nsurlconnections-example/他正在使用字典来管理多个请求

答案 2 :(得分:0)

为每个已经多线程的NSURLConnection使用单独的线程是一个坏主意。它毫无意义地使用系统资源并且击败NSURLConnections尝试以最佳方式管理连接。但是,它确实有效,所以如果您没有收到委托消息,那么您做错了。而不是找到替代方法,你应该尝试使用runloop来解决问题的根源。

答案 3 :(得分:0)

我正在使用ASIHTTPRequest来执行类似的操作。通过以下代码更改downloadAllIcons方法以满足您的要求,

  [NSThread detachNewThreadSelector:@selector(downloadAllIcons:) toTarget:self withObject:xmlData];

 -(void) downloadAllIcons:(NSData *)_xmlData
 {

 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
  NSArray *IconList= PerformXMLXPathQuery(_xmlData,@"//icon");
 [[NSUserDefaults standardUserDefaults] setObject:IconList forKey:@"IconList"];


 for (int i=0; i<[IconList count]; i++) {

    if ([[NSUserDefaults standardUserDefaults] objectForKey:[[IconList objectAtIndex:i] objectForKey:@"nodeContent"]]==nil) {
        NSData * responseData=[self downloadProccessedImage:[[IconList objectAtIndex:i] objectForKey:@"nodeContent"]];


        if(responseData)
            [[NSUserDefaults standardUserDefaults] setObject:responseData forKey:[[IconList objectAtIndex:i] objectForKey:@"nodeContent"]];
        //NSLog(@"%@",[[IconList objectAtIndex:i] objectForKey:@"nodeContent"]);
    }



}
[pool release];



 }


 -(id) downloadProccessedImage:(NSString *)_URL
  {


NSData *response=nil;
NSURL *url = [NSURL URLWithString:_URL];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setTimeOutSeconds:60];
[ASIHTTPRequest setShouldThrottleBandwidthForWWAN:YES];
[request startSynchronous];
NSError *error = [request error];
if (!error)
{
    response = [request responseData];
}       
return response;

    }