转载自:iOS边练边学--NSURLSession、NSURLSessionTask的介绍与使用以及url中包含了中文的处理方法
一、NSURLSession、NSURLSessionTask的使用步骤
首先创建NSURLSession对象
通过NSURLSession对象创建对应的任务
1.NSURLSessionDataTask的GET和POST -- 以及url中包含了中文的解决办法
image image2.NSURLSessionDownloadTask实现小文件的下载
image3.NSURLSessionDownloadTask实现大文件的断点下载 -- 暂时没有实现退出程序后的文件续传
#import "ViewController.h"
// 最好是用到哪个任务就实现哪种任务类型的代理协议
@interface ViewController () <NSURLSessionDownloadDelegate>
@property (weak, nonatomic) IBOutlet UIProgressView *progressBar;
@property (weak, nonatomic) IBOutlet UILabel *precentLabel;
/** task */
@property(nonatomic,strong) NSURLSessionDownloadTask *task;
/** resumeData */
@property(nonatomic,strong) NSData *resumeData;
/** session */
@property(nonatomic,strong) NSURLSession *session;
@end
@implementation ViewController 19
- (NSURLSession *)session
{
if (_session == nil) { 23 // 通过设置NSURLSession的Configuration来指定session的代理,以及代理的线程
_session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[[NSOperationQueue alloc] init]];
}
return _session; 27 }
- (IBAction)start:(id)sender {
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_15.mp4"]];
// 只通过request创建task 文件的具体下载通过代理来实现,
self.task = [self.session downloadTaskWithRequest:request];
[self.task resume];
}
- (IBAction)pause:(id)sender {
// 取消任务 并产生一个恢复数据 -- 任务一旦取消就不能恢复
[self.task cancelByProducingResumeData:^(NSData * _Nullable resumeData) {
// 将恢复数据存入变量
self.resumeData = resumeData;
}];
}
- (IBAction)goOn:(id)sender {
// 任务已经被取消了,只能重新开启任务,通过resumeData继续下载任务
self.task = [self.session downloadTaskWithResumeData:self.resumeData]; 50
// 恢复任务
[self.task resume];
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
}
#pragma mark - <NSURLSessionDownloadDelegate>
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
{
// bytesWritten -- 本次写入的长度
// totalBytesWritten -- 目前共写入的长度
// totalBytesExpectedToWrite -- 期望的长度,也就是总长度
// 在主线程中修改UI界面
[[NSOperationQueue mainQueue]addOperationWithBlock:^{
self.progressBar.progress = 1.0 * totalBytesWritten / totalBytesExpectedToWrite;
self.precentLabel.text = [NSString stringWithFormat:@"%0.1f%%",self.progressBar.progress * 100];
}];
NSLog(@"%zd / %zd",totalBytesWritten,totalBytesExpectedToWrite);
}
// 完成下载的时候调用,系统默认将下载的文件存放到了沙盒的temp文件中
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
{
// 剪切文件到Caches
NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:downloadTask.response.suggestedFilename];
NSFileManager *mgr = [NSFileManager defaultManager]; 91
[mgr moveItemAtURL:location toURL:[NSURL fileURLWithPath:filePath] error:nil];
NSLog(@"didFinishDownloadingToURL");
}
// 任务完成的时候调用
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
NSLog(@"didCompleteWithError");
}
@end
简单的界面:
image
网友评论