带有sendAsynchronousRequest的NSURLConnection进度条Objective-C

我正在用下面的方法下载一大堆zip文件。 这可能需要一点时间,所以我想显示一个进度条。

我已经研究了如何处理NSURLConnection的委托方法,看起来很简单,但是我想用“sendAsynchronousRequest”实现同样的function。 如何获得下载的字节数以及预期的总字节数,以便显示进度条? 我明白,如果我以我正在做的方式开始下载,我不能使用委托方法。

// Begin the download process - (void)beginDownload:(NSMutableArray *)requests { // Now fire off a bunch of requests asynchrounously to download self.outstandingRequests = [requests count]; for (NSURLRequest *request in requests) { // Get the request [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { // Error check if ( error != nil ) { // The alertview for login failed self.appDelegate.warningView.title = @"Refresh Error!"; self.appDelegate.warningView.message = [error localizedDescription]; // Show the view [self.appDelegate.warningView show]; // Debug if ( DEBUG ) { NSLog(@"A request failed - %d left!",self.outstandingRequests); } } else { // Debug if ( DEBUG ) { NSLog(@"A request is done - %d left!",self.outstandingRequests); } } // Decrement outstanding requests self.outstandingRequests--; // No requests are left if (self.outstandingRequests == 0) { // Debug if ( DEBUG ) { NSLog(@"All requests are done!"); } // Get rid of loading view [self performSelector:@selector(dismissLoadingView) withObject:nil afterDelay:0.15]; } }]; } } 

https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSURLConnectionDownloadDelegate_Protocol/NSURLConnectionDownloadDelegate/NSURLConnectionDownloadDelegate.html#//apple_ref/doc/uid/TP40010954-CH2-SW1

如何在下载文件时为NSURLConnection创build进度条?

http://iphonedevsdk.com/forum/iphone-sdk-development/24233-nsurlconnection-with-uiprogressbar.html

http://iphoneeasydevelopment.blogspot.com/2011/10/use-progess-bar-when-downloading-file.html

sendAsynchronousRequest不能用于你的目的,因为它不会调用你的callback,直到请求完成。 您需要使用initRequest:withDelegate:并处理您自己的数据积累。

当收到标题(可能多次redirect)你的didReceiveResponse方法将被调用,你可以在那里拿起预期的大小:

 -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { _expectedBytes = (NSUInteger)response.expectedContentLength; _data = [NSMutableData dataWithCapacity:_expectedBytes]; // make a progress update here } 

每次接收到大量数据时,您都会收到对委托方法didReceiveData的调用,因此您知道到目前为止您已收到多less数据。

 -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { [_data appendData:data]; _receivedBytes = _data.length; // make a progress update here }