Реализовать асинхронную загрузку (NSURLConnection) на отдельном NSThread? - PullRequest
1 голос
/ 13 марта 2011

Это может звучать странно, но, пожалуйста, потерпите меня.У меня есть 6-7 вызовов API, которые делают запрос к серверу один за другим.Я хочу реализовать эти вызовы в отдельном потоке.Но когда я делаю это, ни один из моих методов делегата (NSURLConnection) не вызывается даже после управления отдельным NSRunloop ([[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate: [NSDate distantFuture]];)

Может кто-нибудь предложитьмне альтернативный подход для того же или любого исправления в существующем функционале ??

Ответы [ 4 ]

0 голосов
/ 14 марта 2011

Я использую 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;

    }
0 голосов
/ 13 марта 2011

быстрый Google вырвал это: http://blog.emmerinc.be/index.php/2009/03/15/multiple-async-nsurlconnections-example/ он использует словарь для управления несколькими запросами

0 голосов
/ 13 марта 2011

Использование отдельного потока для каждого NSURLConnection, который уже многопоточный, является плохой идеей. Это просто бессмысленно использовать системные ресурсы и побеждать попытки NSURLConnections оптимально управлять соединениями. Однако это работает, поэтому, если вы не получаете сообщения делегата, вы делаете что-то не так. Вместо того, чтобы найти альтернативный способ сделать это, вы должны попытаться разобраться в проблеме с помощью runloop.

0 голосов
/ 13 марта 2011

Используйте взамен ASIHTTPRequest . Это гораздо проще в использовании, чем NSURLConnection.

...