2011-03-13 60 views
1

這聽起來很奇怪,但請耐心等待。我有6-7個API調用,它們會逐個請求服務器。我想在一個單獨的線程中實現這些調用。但是,當我做到這一點,沒有我的委託方法(NSURLConnection的中)被調用,甚至管理一個單獨的NSRunloop 後([NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate的distantFuture];)在單獨的NSThread上實現異步下載(NSURLConnection)?

任何人都可以表明我對現有功能進行相同或任何更正的替代方法?

回答

0

快速谷歌扔了這一點:http://blog.emmerinc.be/index.php/2009/03/15/multiple-async-nsurlconnections-example/他是用字典來管理多個請求

+0

嗨JFoulkes,我卡在障礙與多個NSURLConnections無關。相反,它是關於在單獨的NSThread中管理連接。正如我上面提到的,請求按順序依次進行。我搜索了它,發現了類似NSOperation的東西,但它並沒有給我準確的想法做什麼? – 2011-03-13 15:33:26

0

使用每個NSURLConnection的,這已經是多線程是一個壞主意一個單獨的線程。這只是毫無意義地使用系統資源,並擊敗NSURLConnections嘗試最佳管理連接。然而,它確實有效,所以如果你沒有收到委託消息,那麼你做錯了什麼。而不是找到另一種方法來處理它,你應該試着用runloop來解決你的問題。

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; 

    }