美文网首页
iOS边练边学--NSURLSession、NSURLSessi

iOS边练边学--NSURLSession、NSURLSessi

作者: 路漫漫其修远兮Wzt | 来源:发表于2018-06-12 09:55 被阅读8次

    转载自:iOS边练边学--NSURLSession、NSURLSessionTask的介绍与使用以及url中包含了中文的处理方法

    一、NSURLSession、NSURLSessionTask的使用步骤

    首先创建NSURLSession对象
    通过NSURLSession对象创建对应的任务

    11111.png

    1.NSURLSessionDataTask的GET和POST -- 以及url中包含了中文的解决办法

    image image

    2.NSURLSessionDownloadTask实现小文件的下载

    image

    3.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

    相关文章

      网友评论

          本文标题:iOS边练边学--NSURLSession、NSURLSessi

          本文链接:https://www.haomeiwen.com/subject/nqhleftx.html