IOS 网络开发NSURLSession(三)DownloadTask

原创Blog,转载请注明出处 blog.csdn.net/hello_hwc

Demo 效果 下载一个URL,然后显示的ImageView并且保存到相册

之前的相册

保存图片后的相册

一 DownloadTask和DataTask的区别

简而言之,DownloadTask是把文件直接download到磁盘。 详细来说,有以下几点区别

DownloadTask支持BackgroundSession,而dataTask不支持 DownloadTask支持断点续传(下载到一半的时候暂停,重启后继续下载,前提下载的服务器支持断点续传)二 用Block的方式来处理DownloadTask

这种情况下和DataTask类似,处理起来比较简单,但是不灵活。 其中,,Location是download临时文件存储的路径

downloadTaskWithURL:(NSURL *) completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {}];

继续上一次保存的数据下载

downloadTaskWithResumeData:(NSData *) completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {}]

这里的ResumeData是通过

[self.downloadTask cancelByProducingResumeData:^(NSData *resumeData)completionHandler]

或者在Session的代理函数的Error中存储,Key是NSURLSessionDownloadTaskResumeData

-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error三 用代理的方式处理

除了NSURLSessionDelegate用来处理Session层次的事件,NSURLSessionTaskDelegate处理Task的共性事件之外,还有NSURLSessionDownloadTaskDelegate 用来特别处理Download事件。 几个主要函数

每次在用上文中的ResumeData创建DownloadTask之后,然后让task开始执行,这个函数就会调用。

– (void)URLSession:(NSURLSession *)sessiondownloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffsetexpectedTotalBytes:(int64_t)expectedTotalBytes

下载的进度

– (void)URLSession:(NSURLSession *)sessiondownloadTask:(NSURLSessionDownloadTask *)downloadTaskdidWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWrittentotalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite

下载完成的事件 注意,一定要在这个函数返回之前,对数据进行使用,或者保存

– (void)URLSession:(NSURLSession *)sessiondownloadTask:(NSURLSessionDownloadTask *)downloadTaskdidFinishDownloadingToURL:(NSURL *)location四 Demo讲解

Demo比较简单,

(strong,nonatomic)NSURLSession * session;@property (strong,nonatomic)NSURLSessionDownloadTask * downloadTask;@property (weak, nonatomic) IBOutlet UITextField *urltextfield;@property (weak, nonatomic) IBOutlet UIImageView *imageview;@property (weak, nonatomic) IBOutlet UIProgressView *progressview;//开始下载- (IBAction)download:(id)sender {= NO;= 0.0;;downloadTaskWithURL:[NSURL URLWithString:imageurl]];[self.downloadTask resume];[self.session finishTasksAndInvalidate];}//初始化-(void)viewDidLoad{= self;NSURLSessionConfiguration * configuration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@”id”];self.session = [NSURLSession sessionWithConfiguration:configurationdelegate:selfdelegateQueue:[NSOperationQueue mainQueue]];}//Session层次的Task完成的事件-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{if (error) {UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@”Error”message:error.localizedDescriptiondelegate:nilcancelButtonTitle:@”OK”otherButtonTitles: nil];[alert show];}= YES;}//Task完成的事件-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location{NSData * data = [NSData dataWithContentsOfURL:location.filePathURL];UIImage * image = [UIImage imageWithData:data];= image;UIImageWriteToSavedPhotosAlbum(image, nil,nil,nil);self.session = nil;}-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes{}//下载进度的代理-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite{if (totalBytesExpectedToWrite != NSURLSessionTransferSizeUnknown) {= totalBytesWritten/(float)totalBytesExpectedToWrite;}}//TextField Delegate-(BOOL)textFieldShouldReturn:(UITextField *)textField{[self.urltextfield resignFirstResponder];return YES;}@end

别人失去了信心,他却下决心实现自己的目标。

IOS 网络开发NSURLSession(三)DownloadTask

相关文章:

你感兴趣的文章:

标签云: