2010-06-29 2 views
1

Я пытаюсь заставить NSURLConnection работать в моем приложении. Я почти точно выполнил код Apple, но, похоже, он не работает. NSURLConnection находится внутри метода, называемого downloadSave. Этот метод работает корректно через конец, и мой журнал указывает: «Connection Exists» - однако после этого ничего не происходит, как если бы никто из методов делегата не вызывался.iPhone NSURLConnection - делегаты не работают

NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; 

    NSString *tempString = [[NSString alloc]initWithFormat:@"http://www.myWebsite.com/%@.jpg",chartFileName]; 
    NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:tempString] 
               cachePolicy:NSURLRequestUseProtocolCachePolicy 
              timeoutInterval:10.0]; 


    NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; 
    if (theConnection) { 


     mutableData = [[NSMutableData data] retain]; 
     self.image = nil; 
     NSLog(@"connection exists"); 


    } else { 
     UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Connection Error" message:@"There was an error contacting the servers. Please try again." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
     [alert show]; 
     [alert release]; 
     [activityIndicator stopAnimating]; 


    } 

    [pool drain]; 
    [pool release]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 

    NSLog(@"got to connection did receive response"); 
    [mutableData setLength:0]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 

    [mutableData appendData:data]; 
    NSLog(@"got some data were at %i",mutableData.length); 
} 


- (void)connection:(NSURLConnection *)connection 
    didFailWithError:(NSError *)error 
{ 

    [connection release]; 
    // receivedData is declared as a method instance elsewhere 
    self.mutableData = nil; 

    NSLog(@"Connection failed! Error - %@ %@", 
      [error localizedDescription], 
      [[error userInfo] objectForKey:NSErrorFailingURLStringKey]); 
} 


- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 

    NSLog(@"Succeeded! Received %d bytes of data",[mutableData length]); 

//more code follows to display the downloaded image 

} 

Единственное, что появляется в журнале является: «Соединение Exists»

+0

Как вы используете пул релизов, вы вызываете NSURLConnection в отдельном потоке? По внешнему виду вы создаете NSURLConnection в дочернем потоке, но ваши методы делегирования находятся в основном потоке, который, как я считаю, не работает – Rudiger

ответ

3

Я могу только догадываться, ваш код, который downloadSave в называется в отдельном потоке, как у вас есть NSAutoReleasePool (не говорю, вот что вы делаете, но скорее всего). NSURLConnection может отвечать только на методы делегата в основном потоке, когда он инициализируется в основном потоке.

Поскольку NSURLConnection уже является делегированным делегатом, вам не нужно создавать его в потоке. Если вам нужно, чтобы пронизывать его по какой-то причине вы должны быть в состоянии использовать

NSError *error; 
NSURLResponse *response; 
NSData *connectionData = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:&response error:&error]; 

И что должно возвращать данные в дочернем поток.

Смежные вопросы