Поток данных Iphone JPEG не содержит изображений с помощью NSURLConnection - PullRequest
2 голосов
/ 30 июня 2010

Ранее я загружал изображения для своего приложения, используя dataWithContentsOfURL для загрузки jpg, а затем writeToFile для его сохранения.

Я недавно начал использовать NSURLConnetion для того же, но теперь я получаю следующие ошибки и сбой:

Поврежденные данные JPEG: 87 посторонних байтов Поток данных JPEG не содержит изображения

Я знаю, что эти изображения не являются поврежденными, так как приложение загружало их нормально, используя предыдущий метод.Вот мой код:

-(void) downloadSave {

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

    NSString *tempString = [[NSString alloc]initWithFormat:@"http://www.mysite.com/%@.jpg",chartFileName];
    NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:tempString]
                                              cachePolicy:NSURLRequestUseProtocolCachePolicy
                                          timeoutInterval:10.0];
    // create the connection with the request
    // and start loading the data

    NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
    if (theConnection) {
        // Create the NSMutableData to hold the received data.
        // receivedData is an instance variable declared elsewhere.
        mutableData = [[NSMutableData data] retain];
        self.image = nil;
        NSLog(@"connection exists");
        [NSURLConnection connectionWithRequest:theRequest delegate:self];

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


    }




//  NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
//                                                       NSUserDomainMask, YES);

//  NSString *docsPath = [paths objectAtIndex:0];
//  NSString *downloadPath = [[[NSString alloc]initWithFormat:@"http://www.mysite.com/%@.jpg",chartFileName]autorelease];
//  downloadedChartData = nil;


    [pool drain];
    [pool release];




}


- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    // This method is called when the server has determined that it
    // has enough information to create the NSURLResponse.

    // It can be called multiple times, for example in the case of a
    // redirect, so each time we reset the data.

    // receivedData is an instance variable declared elsewhere.
    NSLog(@"got to connection did receive response");
    [mutableData setLength:0];
}




- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    // Append the new data to receivedData.
    // receivedData is an instance variable declared elsewhere.
    [mutableData appendData:data];
//  NSLog(@"got some data, total: %i",mutableData.length);
}


- (void)connection:(NSURLConnection *)connection
  didFailWithError:(NSError *)error
{
    // release the connection, and the data object
 //   [connection release];
    // receivedData is declared as a method instance elsewhere
   // self.mutableData = nil;

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


- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    // do something with the data
    // receivedData is declared as a method instance elsewhere
    NSLog(@"Succeeded! Received %d bytes of data",[mutableData length]);
    [connection release];
    // release the connection, and the data object
    NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                         NSUserDomainMask, YES);
    NSString *docsPath = [paths objectAtIndex:0];
    self.image = nil;

    NSString *savePath = [[[NSString alloc]initWithFormat:@"%@/%@.jpg",docsPath, chartFileName]autorelease];

    [mutableData writeToFile:savePath atomically:YES];
    self.mutableData = nil;

1 Ответ

8 голосов
/ 05 июля 2010

Вы инициализируете и запускаете два NSURLConnections с одним и тем же делегатом.Поскольку ваши методы делегата не проверяют, какое соединение вызвало их, вы смешиваете байты, в два раза превышающие ваш образ в одном экземпляре NSMutableData.

// Creates, initializes and starts an instance of NSURLConnection    
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
...
// Creates, initializes and starts another instance of NSURLConnection, with same request and delegate
[NSURLConnection connectionWithRequest:theRequest delegate:self];

Оба соединения сообщают об одной и той же реализации в одном экземпляре делегата, что означаетих данные записываются в тот же NSMutableData в случайном порядке.

Я бы предложил просто избавиться от строки:

[NSURLConnection connectionWithRequest:theRequest delegate:self];

Еще одна вещь: почему вы используете пул авто-выпуска в downloadSave?Если вы вызываете его из основного потока, у вас есть только один NSURLRequest, автоматически выпущенный в этом пуле.Если вы вызываете его из другого потока, вы должны позаботиться о том, чтобы цикл запуска этого потока был настроен и запущен, или вы вообще не получите никаких обратных вызовов делегата.

...