2010-06-30 53 views
2

我之前通过使用dataWithContentsOfURL下载了一个jpg然后writeToFile来保存它,从而为我的应用下载图像。Iphone JPEG数据流不包含使用NSURLConnection的图像

我最近; Y开始使用NSURLConnetion做相同的,但现在我得到follwoing错误和崩溃:

腐败JPEG数据:87个多余字节 JPEG数据流内没有图像

我知道这些图像不是corrumpt,因为应用程序正在使用以前的方法正常下载它们。这里是我的代码:

-(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; 
+0

只是一个更新 - 当我通过查找器检查文档文件夹以查看我已下载的图像时,看起来它们实际上已损坏。为什么使用NSURLConnection会导致它们被破坏? – Brodie 2010-06-30 06:50:00

+1

你看过下载的“图像”了吗?在文本编辑器中打开它,看看里面有什么......也许你的问题是其他的东西,比如404错误页面等。另外,还有stringByAppendingPathComponents:它更适合路径扩展。 – Eiko 2010-07-02 20:04:17

+0

您应该接受Tonclon的回答,或者让我们知道它是否不正确。它看起来很适合我。 – 2010-07-07 15:01:14

回答

8

要初始化并启动 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在该池中自动释放。如果从另一个线程调用它,则必须注意,该线程的runloop已设置并正在运行,否则根本不会收到任何委托回调。