iOS NSURLSession 基础用法总结

我们常用的AFNetWorking是基于NSURLSession封装的,NSURLSession是系统提供的请求类,这里做一个总结,先看几段代码

 // 向网络请求数据
- (void)NSURLSessionTest {
    // 1.创建url
    // 请求一个网页
    NSString *urlString = @"https://www.baidu.com";
    
    // 一些特殊字符编码 当网址中含有中文字符时我们无法直接使用,需要把网址的字符串编码后再转为URL
//    由于URL支持26个英文字母、数字和少数几个特殊字符,因此,对于url中包含非标准url的字符时,就需要对其进行编码
    urlString = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
    NSURL *url = [NSURL URLWithString:urlString];
    
    // 2.创建请求 并:设置缓存策略为每次都从网络加载 超时时间30秒
    NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:30];
    
    // 3.采用苹果提供的共享session
    NSURLSession *sharedSession = [NSURLSession sharedSession];
    
    // 4.由系统直接返回一个dataTask任务
    NSURLSessionDataTask *dataTask = [sharedSession dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        // 网络请求完成之后就会执行,NSURLSession自动实现多线程
     
        NSLog(@"----isMainThread:%d",[NSThread isMainThread]);
        if (data && (error == nil)) {
            // 网络访问成功
            NSLog(@"data=%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
        } else {
            // 网络访问失败
            NSLog(@"error=%@",error);
        }
    }];
    
    // 5.每一个任务默认都是挂起的,需要调用 resume 方法
    [dataTask resume];
}
/// 文件下载
- (void)NSURLSessionDownloadTaskTest { // 1.创建url
  NSString *urlString = [NSString stringWithFormat:@"http://www.baidu.com/周杰伦 - 枫.mp3"]; // 一些特殊字符编码
  urlString = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
  NSURL *url = [NSURL URLWithString:urlString]; // 2.创建请求
  NSURLRequest *request = [NSURLRequest requestWithURL:url]; // 3.创建会话,采用苹果提供全局的共享session
  NSURLSession *sharedSession = [NSURLSession sharedSession]; // 4.创建任务
  NSURLSessionDownloadTask *downloadTask = [sharedSession downloadTaskWithRequest:request completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) { if (error == nil) { // location:下载任务完成之后,文件存储的位置,这个路径默认是在tmp文件夹下! // 只会临时保存,因此需要将其另存
          NSLog(@"location:%@",location.path); // 采用模拟器测试,为了方便将其下载到Mac桌面 // NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
          NSString *filePath = @"/Users/userName/Desktop/周杰伦 - 枫.mp3";
          NSError *fileError;
          [[NSFileManager defaultManager] copyItemAtPath:location.path toPath:filePath error:&fileError]; if (fileError == nil) {
              NSLog(@"file save success");
          } else {
              NSLog(@"file save error: %@",fileError);
          }
      } else {
          NSLog(@"download error:%@",error);
      }
  }]; // 5.开启任务
[downloadTask resume];
}
/// 以流的方式上传,大小理论上不受限制,但应注意时间
- (void) NSURLSessionBinaryUploadTaskTest { // 1.创建url  采用Apache本地服务器
    NSString *urlString = @"http://localhost/upload.php"; urlString = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]];
    NSURL *url = [NSURL URLWithString:urlString]; // 2.创建请求
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; // 文件上传使用post
    request.HTTPMethod = @"POST"; // 3.开始上传   request的body data将被忽略,而由fromData提供
    [[[NSURLSession sharedSession] uploadTaskWithRequest:request fromData:[NSData dataWithContentsOfFile:@"/Users/userName/Desktop/IMG_0359.jpg"]     completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { if (error == nil) {
            NSLog(@"upload success:%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
        } else {
            NSLog(@"upload error:%@",error);
        }
    }] resume];
}

由此可以看出 通过NSURLSession 创建NSURLSessionDataTask,
另外,还可以设置其它一些信息,比如请求头,请求体等等,如下:
注意,下面的request应为NSMutableURLRequest,即可变类型

// 告诉服务器数据为json类型
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; // 设置请求体(json类型)
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:@{@"password":@"123456"} options:NSJSONWritingPrettyPrinted error:nil];
request.HTTPBody = jsonData;

NSURLSession 的获取可以使用系统默认的 sharedSession;
还可通过NSURLSessionConfiguration配置NSURLSession,
NSURLConnection是全局性的,即它的配置对全局有效,如果有两个链接需要不同的cookies、证书这些公共资源,则NSURLConnection无法满足要求,这时NSURLSession的优势则体现出来,NSURLSession可以同过NSURLSessionConfiguration可以设置全局的网络访问属性。

NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; // delegateQueue:请求完成回调函数和代理函数的运行线程,如果为nil则系统自动创建一个串行队列,不影响sessionTask的运行线程

NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];

三种会话方式:

defaultSessionConfiguration:进程内会话(默认会话),类似 NSURLConnection的标准配置,用硬盘来缓存数据。
ephemeralSessionConfiguration:临时的进程内会话(内存),不会将cookie、缓存储存到本地,只会放到内存中,当应用程序退出后数据也会消失,可以用于实现“秘密浏览”
backgroundSessionConfiguration:建立后台会话可以在应用程序挂起,退出,崩溃的情况下运行上传和下载任务,后台另起一个线程。另外,系统会根据设备的负载程度决定分配下载的资源,因此有可能会很慢甚至超时失败。

你可能感兴趣的:(iOS NSURLSession 基础用法总结)